2011-10-25 25 views
5

使用通用清单,检查是否存在具有特定条件的项目,如果存在,选择它,而不搜索两遍整个列表:在使用前检查通用清单中的项目

例如:

if (list.Exists(item => item == ...)) 
{ 
    item = list.Find(item => item == ...) 
    .... 
} 
+0

只要做到这一点。 – dlev

+1

如果item!= null,那么你就是黄金 –

回答

5

要么使用Find一次,并将结果与​​default(T)比较,或者如果default(T)可能是项目本身,使用FindIndex并检查是否指数为-1:

int index = list.FindIndex(x => x...); 
if (index != -1) 
{ 
    var item = list[index]; 
    // ... 
} 

如果您使用.NET 3.5或更高版本,它更习惯使用LINQ - 再次,如果default(T)是没有问题的,你可以使用类似:

var item = list.FirstOrDefault(x => x....); 
if (item != null) 
{ 
    ... 
} 

使用LINQ可以让你稍后从List<T>更改为其他集合,而无需更改代码。

3

你可以这样做只是使用LINQ,只需添加在您的命名空间的顶部使用System.Linq;

首先,如果你想获得的所有结果:

var items = list.Where(item=>item.Id == giveID).ToList(); 

或者,如果你只是想第一个结果;

var result = list.FirstOrDefault(item=>item.ID == givenID); 

而不是item.Id == givenID你可以把你自己的标准。例如,如果产品线,你可以做item == "Test",或者为int做item == 5,...

+0

默认情况下,我不会执行'.ToList()'。这给你带来表现利润的机会。 '.ToList()'给你一个找到的项目列表,如果没有,你会得到一个IEnumerator遍历项目。 – Fischermaen

+0

@Fischermaen我不会那样做,但是因为我看到OP对linq不熟悉,并且执行导致模糊不清,我建议这样做,总而言之,您最终应该执行准备好的表达式树,所以不写入列表,它只是使查询并没有得到任何IEnumerable(不要因编译时看到的错误)。你可以在你想要的时候执行它,但是如果你想要的话,应该这样做。它可以通过foreach循环或其他一切来完成 –

5
item = list.Find(item => item == ...); 
if(null != item) 
{ 
    //do whatever you want 
} 
+1

请注意,如果'null'是您可能正在查找的有效值,则这不起作用。它也不适用于'List '等等。另外请注意,在C#条件中不需要使用“常量优先”方法,除非您明确检查与“bool”值相等的情况。 –

+0

是的,谢谢,你说得对。但我不明白你的第二点有什么区别null!= item和item!= null使? –