2

从集合对象中删除/跳过项目的最佳方法是什么

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但我正在寻找最佳实践

4

6 回答 6

9

如果您想从列表中破坏性地删除有问题的项目,请使用该RemoveAll(Predicate<T>)方法;它从列表中删除与谓词匹配的每个项目:

myList.RemoveAll(x=>x.Comment == whatever);

如果您想保持列表相同并制作过滤后的项目序列,请使用Where

foreach(Item item in myList.Where(x=>x.Comment != whatever))
    ...

这使列表保持不变;只是为您提供了Where应用了过滤器的列表的“视图”。

于 2012-04-17T19:13:19.013 回答
6

你可以Where像...

foreach (var a in personList.where(x => !string.IsNullOrWhitespace(x.Comment))
{
   // code
}
于 2012-04-17T19:08:37.923 回答
1

您甚至可以在使用之前使用 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))
于 2012-04-17T19:10:25.370 回答
1

您可以关心两个扩展:

Where

var subset = collection.Where(x => x != someValue);

此方法简单地获取所有元素并将谓词应用于它,仅产生匹配的元素。

Skip, SkipWhile:

var skipFirstThreeItems = collection.Skip(3);
var skippedItems = collection.SkipWhile(x => x != "SomeValue")

与第二个的重要区别是它将跳过值直到谓词匹配,然后它将获取所有后续元素。

于 2012-04-17T19:11:17.283 回答
1

这会将列表限制为具有非空和非空白字符串的注释:

List<Person> personList = dao.GetData(123); 
filteredList = personList.Where(x => !String.IsNullOrWhitespace(x.Comment));
于 2012-04-17T19:09:16.673 回答
0

我经常认为最好的方法是有争议的,但我喜欢明确说明代码在做什么:

var peopleWithComments = dao.GetData(123)
  .Where(person => person.Comment.IsPresent());

...

public static class StringExtensions {
  public bool IsPresent(this string self) {
    return !String.IsNullOrWhitespace(self);
  }
}
于 2012-04-18T03:30:19.657 回答