Keep only elements of a list that have only letters
我有一个List,它包含一些具有非字母字符的元素。例如,我可能有一个根本不包含任何字母的#232353;,或者我可能有一个SomeText,SomeOtherText,并且该元素包含一个逗号,它也不是字母。如何使用LINQ删除这些元素?像这样:
1
| MyList = MyList.Where(...) |
谢谢。
- 请参见验证字符串是否只包含C中的字母,以及如何在遍历通用列表时从该列表中删除元素?.学会把你的问题分成几个小部分,你会发现所有的问题都得到了解答。
您可以使用Char.IsLetter检查字符串中的所有字符是否都是字母:
1
| MyList = MyList.Where(s => s.All(Char.IsLetter)).ToList(); |
- 好的,谢谢:看起来不错,但它说它不能将IEnumerable转换为list
- @Frenchie很抱歉,错过了这件事-只需添加ToList()调用,从过滤后的字符串中创建新的List。
- 你的答案和贾里德的答案"幕后"有什么区别?
- @如果您需要在同一个列表中保存筛选的字符串,那么最好从列表中删除它们,而不是创建新的列表。如果只需要枚举结果,就不需要修改原始列表或创建新列表。但是如果你需要像List那样的结果,那么使用jared的选项。
因为它在List上,所以可以使用RemoveAll方法删除与特定谓词匹配的所有值。
1
| MyList.RemoveAll(s => s.Any(c => !Char.IsLetter(c))); |
- +1个不错的选择。你也可以使用列表的FindAll方法,但这将创建新的结果列表,就像我的答案一样。
- "既然这是在一个列表上",这意味着什么?
- @这意味着可以在不需要创建新集合的情况下就地删除。List类型具有直接修改集合的方法add/remove。另一方面,像IEnumerable这样的类型具有扩展方法,这些方法可以像remove like一样删除,但可以创建一个新的集合。这意味着您将以类似于e = e.Where(x => ...)的语法结束。
- 啊,好吧,在一种情况下,我们会得到两个列表,其中一个被重新分配给原始引用,另一个被垃圾收集,而对于作为列表类型一部分的方法,我们只保留一个列表。是这样吗?
- @法奇,没错
- 好的,酷,每天学习,谢谢。
- 还有一个简单的问题:从技术上讲,列表是一种IEnumerable类型,它有其他方法吗?
- @法国佬是的。我会用下面的话来形容。List是一种具有实现IEnumerable的方法和属性的类型(以及IList)
- 好的,谢谢你的解释。