【问题标题】:Search within a list in C# [duplicate]在 C# 中的列表中搜索 [重复]
【发布时间】:2012-05-22 18:08:07
【问题描述】:

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

class CompareDesignGroup
{
    string FieldId;
    string Caption;
}

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

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

【问题讨论】:

  • 使用 Linq 检索数据。
  • var resultsList = listOfYourClasses.Where(item=>item.FieldId == yourFieldIdOfInterest).ToList();

标签: c# .net c#-4.0


【解决方案1】:

是的。使用LINQList 的内置功能。

【讨论】:

    【解决方案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");
    

    【讨论】:

    • 这不会像 OP 要求的那样返回列表元素。
    • 可以省略Where,直接将谓词放在FirstOrDefaultSingleOrDefault
    【解决方案3】:

    有很多方法可以在列表中查找项目。

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

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

    使用List&lt;T&gt;

    给定一个声明为的列表:

    List<CompareDesignGroup>() list = new List<CompareDesignGroup>();
    

    查找与搜索条件匹配的 first 元素(如果未找到任何项目,它将返回 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&lt;T&gt;(或IList&lt;T&gt;,例如)

    给定一个声明为的列表:

    IEnumerable<CompareDesignGroup> list = ...
    

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

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

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

    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 扩展方法有很多,我建议大家都看看,找到更适合您需求的。

    【讨论】:

      【解决方案4】:

      您可以像这样使用 LINQ:

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

      如果您使用FirstOrDefault 方法,当列表不包含具有已知ID 的记录时,result 将是null。所以在使用result之前检查它是否不是null

      【讨论】:

        【解决方案5】:

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

        List<CompareDesignGroup> list = // ..;
        CompareDesignGroup item = list.Find(c => c.FieldId == "SomeFieldId");
        

        如果列表中没有匹配项,item 将为空。

        如果您需要查找不止一项,可以使用FindAll method

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

        【讨论】:

          【解决方案6】:
          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-04-21
            • 2013-01-30
            • 1970-01-01
            • 2014-12-14
            • 2016-06-01
            • 1970-01-01
            • 2019-05-25
            相关资源
            最近更新 更多