在C#列表中搜索

时间:2012-05-15 08:49:53

标签: c# .net c#-4.0

我有一个包含以下结构的列表。

class CompareDesignGroup
{
    string FieldId;
    string Caption;
}

该列表包含上述结构的项目。

如果已知FieldId,是否可以检索列表中的元素?

6 个答案:

答案 0 :(得分:5)

您可以在通用列表类中使用Find method。 find方法采用一个谓词,允许您过滤/搜索单个项目的列表。

List<CompareDesignGroup> list = // ..;
CompareDesignGroup item = list.Find(c => c.FieldId == "SomeFieldId");
如果列表中没有匹配项,

item将为null。

如果您需要查找多个项目,可以使用FindAll method

List<CompareDesignGroup> list = // ..;
List<CompareDesignGroup> result= list.FindAll(c => c.FieldId == "SomeFieldId");

答案 1 :(得分:2)

您可以使用Where然后使用FirstOrDefault。这是一个LINQ表达式。

var ls = new List<CompareDesignGroup>();
var result = ls.Where(a => a.FieldId=="123").FirstOrDefault();

SingleOrDefault获取您想要的项目。像这样:

var ls = new List<CompareDesignGroup>();
var result = ls.Where(a => a.FieldId=="123").SingleOrDefault()

甚至更简单:

var result = ls.SingleOrDefault(a => a.FieldId=="123");
var result2 = ls.FirstOrDefault(a => a.FieldId=="123");

答案 2 :(得分:2)

是。使用LINQList的内置功能。<​​/ p>

答案 3 :(得分:2)

您可以像这样使用LINQ:

CompareDesignGroup result = yourList.FirstOrDefault(x => x.FieldId == yourKnownId);

如果您使用FirstOrDefault方法,则当列表中不包含已知ID的记录时,result将为null。因此,在使用result之前,请检查它是否为null

答案 4 :(得分:1)

List<CompareDesignGroup> listData = new List<CompareDesignGroup>(); // init the data
var result = listData.Where(x=> String.Equals(x.FieldID,"FIELDID KNOWN VALUE"); // gets all data
var first = listData.FirstOrDefault(x=> String.Equals(x.FieldID,"FIELDID KNOWN VALUE"); // gets first search result

答案 5 :(得分:1)

有很多方法可以在列表中找到一个项目。

LINQ提供了一些扩展方法,可用于处理不提供自己的搜索功能的集合(或者当您没有集合本身但只有IEnumerable<T>这样的通用接口时)。如果您有一个List<CompareDesignGroup>对象,并且您将使用该类提供的方法(specialized methods are almost always faster than LINQ methods,那么它们可以使用该类提供的方法,它们知道集合的内部结构,并且不必依赖于许多抽象层)

在所有示例中,我将对FieldId的假设id参数执行文化不变量和区分大小写的比较。这可能不是您所需要的,您可能需要根据您的要求进行更改。

使用List<T>

给出一个声明为:

的列表
List<CompareDesignGroup>() list = new List<CompareDesignGroup>();

要查找与搜索条件匹配的第一个元素(如果未找到任何项目,则会返回null):

CompareDesignGroup item = list.Find(
    x => String.Equals(x.FieldId, id,  StringComparison.InvariantCulture));

要查找所有符合搜索条件的元素:

List<CompareDesignGroup> items = list.FindAll(
    x => String.Equals(x.FieldId, id,  StringComparison.InvariantCulture));

使用IEnumerable<T>(或IList<T>

给出一个声明为:

的列表
IEnumerable<CompareDesignGroup> list = ...

要查找与搜索条件匹配的第一个元素(null,如果未找到任何项目):

CompareDesignGroup item = list.FirstOrDefault(
    x => String.Equals(x.FieldId, id,  StringComparison.InvariantCulture));

要查找与搜索条件匹配的第一个元素(如果未找到任何项目,则抛出异常):

CompareDesignGroup item = list.First(
    x => String.Equals(x.FieldId, id,  StringComparison.InvariantCulture));

要查找符合搜索条件的所有元素:

IEnumerable<CompareDesignGroup> item = list.Where(
    x => String.Equals(x.FieldId, id,  StringComparison.InvariantCulture));

有很多LINQ扩展方法,我建议大家一起来找一个更适合你需求的方法。