从集合中删除/跳过项目的最佳方法是什么
本文关键字:项目 最佳 方法 是什么 集合 删除 | 更新日期: 2023-09-27 18:31:21
从集合对象中删除/跳过项目的最佳方法是什么
List<Person> personList = new List<Person>()
personList = dao.GetData(123);
personList = personList.Select(x => x.Comment... ????
结果集:
"GCE"
Not available
"" //comments
"RES"
9.97000000
9.99000000
........
........
........
因此,我的目标是名为"评论"的字段,如果评论为空,则不要呈现。
我本可以在foreach
循环中使用if condition
做到这一点,但我正在寻找最佳实践
如果要
破坏性地从列表中删除有问题的项,请使用 RemoveAll(Predicate<T>)
方法;它会从列表中删除与谓词匹配的每个项:
myList.RemoveAll(x=>x.Comment == whatever);
如果要保持列表相同并创建筛选的项目序列,请使用Where
:
foreach(Item item in myList.Where(x=>x.Comment != whatever))
...
这使列表保持不变;Where
只是为您提供应用了过滤器的列表的"视图"。
你可以
使用Where
比如...
foreach (var a in personList.where(x => !string.IsNullOrWhitespace(x.Comment))
{
// code
}
这会将列表限制为具有非空和非空格字符串的注释:
List<Person> personList = dao.GetData(123);
filteredList = personList.Where(x => !String.IsNullOrWhitespace(x.Comment));
甚至可以在使用集合之前使用 LINQ 对其进行筛选。 对于初学者来说,这有点多余:
List<Person> personList = new List<Person>()
personList = dao.GetData(123);
personList = personList.Select(x => x.Comment... ????
听起来您要查找的是:
var personList = dao.GetData(123)
.Where(p => !string.IsNullOrWhitespace(p.Comment))
.Select(p => ...
然后,您可以循环访问personList
中的项目。
当然,回头看,如果你甚至不需要.Select()
(也就是说,如果它除了尝试过滤之外没有做任何事情),那么这更简单:
var personList = dao.GetData(123)
.Where(p => !string.IsNullOrWhitespace(p.Comment))
您可以关注两个扩展:
Where
:
var subset = collection.Where(x => x != someValue);
此方法只是获取所有元素并对其应用谓词,仅生成匹配的元素。
Skip
,SkipWhile
:
var skipFirstThreeItems = collection.Skip(3);
var skippedItems = collection.SkipWhile(x => x != "SomeValue")
与第二个的重要区别在于,它将跳过值,直到匹配谓词,然后它将采用所有后续元素。
我经常认为最好的方法是有争议的,但我喜欢明确代码在做什么:
var peopleWithComments = dao.GetData(123)
.Where(person => person.Comment.IsPresent());
...
public static class StringExtensions {
public bool IsPresent(this string self) {
return !String.IsNullOrWhitespace(self);
}
}