【问题标题】:C# Find object in List<T>C# 在 List<T> 中查找对象
【发布时间】:2012-05-26 20:07:14
【问题描述】:

我有一个列表。我想知道如何编写 LINQ 来查找它们是否存在 id = "CLR" 的 MyTypes 的 obj。

我想知道它是否存在以及它的索引。因此,如果它存在,那么我可以通过它的索引替换为 MyTypes 的新对象,否则添加它。

我知道我可以通过迭代 List 中的项目来做到这一点,但这比使用 LINQ 语句要耗时。有错请指正。

任何人都可以提供帮助。

【问题讨论】:

  • 我不清楚你到底想做什么。你能展示你目前知道的迭代方法吗?该代码可能会阐明整体意图。
  • 这是在 List 还是 List 上。此外,Linq 不会比遍历列表更快,只是更通用且更简洁。

标签: c# list find exists


【解决方案1】:

除非您打算在某个时候迭代整个集合,否则使用 Dictionary 可能更有意义。这样做将允许您按键定位项目,按键检查项目是否存在,并按键插入。不仅如此,这些类型的操作在字典上更快,因为它本质上是一个哈希表。

【讨论】:

    【解决方案2】:

    我认为你想要的是类似

    var obj = myList.FirstOrDefault(x => x.id == "CLR");
    if(obj != null)
    {
        //do stuff here
    }
    

    【讨论】:

      【解决方案3】:

      您实际上并不需要 LINQ;有方便的List&lt;T&gt;.FindIndex 方法

      List<Foo> foos = ...
      int index = foos.FindIndex(foo => foo != null && foo.Id == "CLR");
      
      if(index != -1)
      {
           Foo replacement = ...
           foos[index] = replacement;
      }
      else
      {
           Foo toAdd = ...
           foos.Add(toAdd);
      }
      

      顺便说一句,您确定您实际上不需要某种查找表吗?您的使用模式表明您不需要Dictionary&lt;string, Foo&gt; 或类似名称,而不是列表。

      【讨论】:

      • 谢谢阿尼。实际上我有 2 个主 objs MySaw 和 MyType。两者都可能包含 4-5 条记录。对于每个 MySaw,它们可以是全部/少数 MyType。所以对于每个 Saw,我都在想一个带有 MySaw 和 List 的 obj SawTypeCollection。最后,对于所有锯子和类型的集合,我选择了 Dictionary>,String 是 MySaw 的 id,List 是 SawTypeColelction 中的 List。所以,你们觉得 SawTypeCollection 应该有 Dictionary 而不是 List ???我在某种程度上迷失了方向。
      • 听起来像List&lt;MyType&gt; 应该改为Dictionary&lt;string, MyType&gt;。很难说没有更多信息。
      【解决方案4】:

      可能是这样的:

      MyType item = MyList.FirstOrDefault(x => x.id == "CLR");
      
      if (item != null)
      {
          int index = MyList.IndexOf(item);
          // do something
      }
      

      【讨论】:

      • 为什么要检查它的存在并然后找到索引?为什么不直接找到索引,然后检查返回值是否为-1? (见 Ani 的回答。)
      • 是的,我在想,但我选择了FirstOrDefault,因为 OP 要求提供 LINQ 示例。当然,阿尼的回答更有效率!
      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 2022-01-02
      • 2011-11-30
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多