【问题标题】:Keep only elements of a list that have only letters [duplicate]只保留列表中只有字母的元素[重复]
【发布时间】:2014-01-11 12:23:26
【问题描述】:

我有一个List<string>,其中包含一些具有非字母字符的元素。例如,我可能有 #232353; 根本不包含任何字母,或者我可能有 SomeText,SomeOtherText 并且该元素包含逗号,它也不是字母。如何使用 linq 删除这些元素?像这样的:

MyList = MyList.Where(...)

谢谢。

【问题讨论】:

标签: c# linq


【解决方案1】:

您可以使用Char.IsLetter 来检查字符串中的所有字符是否都是字母:

MyList = MyList.Where(s => s.All(Char.IsLetter)).ToList();

【讨论】:

  • 好的,谢谢:它看起来不错,但它表示无法将 IEnumerable 转换为 List
  • @frenchie 抱歉,错过了 - 只需添加 ToList() 调用即可从过滤后的字符串中创建新的 List<string>
  • 您的回答与 Jared 的回答之间的“幕后”区别是什么?
  • @frenchie 如果您需要将过滤后的字符串保存在同一个列表中,那么最好将它们从列表中删除,而不是创建新列表。如果您只需要枚举结果,则无需修改原始列表或创建新列表。但是,如果您需要 List<string> 的结果,请使用 Jared 的选项
【解决方案2】:

由于这是在 List<string> 上,您可以使用 RemoveAll 方法删除与特定谓词匹配的所有值

MyList.RemoveAll(s => s.Any(c => !Char.IsLetter(c)));

【讨论】:

  • +1 不错的选择。您也可以使用FindAll 列表方法,但这会创建新的结果列表,就像我的回答一样
  • 说“既然这是在列表中”的含义是什么?
  • @frenchie 这意味着可以在原地完成删除,而无需创建新集合。 List<T> 类型具有直接修改集合的 Add / Remove 方法。另一方面,IEnumerable<T> 之类的类型具有类似于删除但创建新集合的扩展方法。这意味着您最终会使用 e = e.Where(x => ...) 这样的语法。
  • 啊,好吧,所以在一种情况下,我们最终得到 2 个列表,其中一个被重新分配给原始引用,另一个被垃圾收集,而对于 List 类型的一部分,我们只保留一个列表。对吗?
  • @frenchie 是正确的
猜你喜欢
  • 2012-04-09
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2019-05-03
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多