【问题标题】:Check for value in list检查列表中的值
【发布时间】:2009-12-23 04:51:35
【问题描述】:

我有一个通用的值列表。我想检查该通用列表中是否存在 Id。

最简单的方法是什么?

例子

List<someCustomObject> mylist = GetCustomObjectList();

int idToCheckFor = 12;

我想通过检查每个 someCustomObject.Id = idToCheckFor 来查看列表中的任何自定义对象中是否存在 12

如果找到匹配项,我就可以开始了,我的方法将返回 bool true。我只是想弄清楚是否有一种简单的方法,而不是遍历列表中的每个项目以查看是否 idToCheckFor == someCustomObject.id 并在找到匹配项时将变量设置为 true。我确信一定有更好的方法来解决这个问题。

【问题讨论】:

  • 所以是的,我将使用 LINQ 选项。但是如果我要循环,我猜是什么,最好的方法是将 bool var 设置为 false ......然后在找到匹配项时将其设置为 true 并在找到匹配项时退出循环并且返回布尔变量。
  • @coffee:如果你在循环,最简单的选择是在循环中找到return true;,然后在循环完成后return false;
  • 对于循环选项 ... foreach(someCustomObject checkObject in mylist) { if (checkObject.Id == idToCheckFor { return true; } } return false;

标签: c#


【解决方案1】:

如果您使用的是 .NET 3.5,使用 LINQ to 对象很容易:

return myList.Any(o => o.ID == idToCheckFor);

除此之外,循环是您唯一的选择。

【讨论】:

  • 嗨 Adam .. 比我的版本更好的查询 :) (+1),你能给我指出一些好的 linq to objects 资源吗,这会很有帮助,谢谢! :)
  • @Mahesh Velaga:看看这本书 C# In Depth。
  • @Mahesh:最有用的资源是Enumerable 静态类上的 MSDN 页面,因为它公开了 LINQ-to-objects 扩展方法。 msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx
【解决方案2】:
Boolean b = myList.Find(obj => obj.id == 12) != null;

【讨论】:

  • 如果您使用的是 3.5(您需要使用 lambda),为什么不使用 LINQ 方法而不是 List&lt;T&gt; 特有的方法?
  • 你不需要 .net 3.5 来使用 lambda。这是一个编译器功能。在使用 VS2008 编写 .Net 2.0 代码时,我一直使用lambas。它使用原生 List 方法生成相当干净的代码。
【解决方案3】:

LINQ 让生活更轻松

mylist.Where(x => x.id == idToCheckFor).Any()

谢谢

【讨论】:

  • 对不起我的坏..不知道我在想什么..谢谢指出:)
【解决方案4】:
 bool found = mylist.Any(p => p.Id == idToCheckFor);

【讨论】:

    【解决方案5】:
    bool bExists = myList.Any(x=>x.id == idToCheckFor);
    

    【讨论】:

      【解决方案6】:
      if(mylist.Any(Item => Item.Id == idToCheckFor))
      {
        do();
      }
      

      【讨论】:

        【解决方案7】:

        我认为您为此使用了错误的数据结构。你需要的是:

        Dictionary<int, someCustomObject> myDictionary = GetCustomObjectDictionary();
        

        现在您可以轻松地检查 ID 是否存在,并具有出色的性能。

        return myDictionary.ContainsKey(idToCheckFor);
        

        【讨论】:

        • 这是一个很难做出的评估,因为你不知道他还在用这个数据结构做什么。
        • 如果您有大量对象并且需要多次搜索,那么字典是您的最佳选择。
        • Dictionary 完全有可能是合适的数据结构,但您假设标识符是唯一的。这很有可能,但不确定。
        • 是的,您拥有 ValueCollection,它提供了与 List 大部分相同的功能。这意味着您可以两全其美,而无需使用 LINQ。
        • 好吧,我从这个问题中推断出他希望这些项目具有唯一的 ID。如果它们不是唯一的,就不是很好的 ID。
        【解决方案8】:

        return myList.Exists(item => item.Id == idToCheckFor);

        有关 linq 资源,您可以查看101 linq samples

        【讨论】:

          【解决方案9】:

          使用 LINQ to Objects。类似于以下内容:

          var result = from l in mylist
                       where l.id = 12
                       select l;
          
          return result != null;
          

          【讨论】:

          • -1。 result 是一个查询,不是一个对象。它永远不会为空。
          • 另外= 是一个赋值运算符,而不是一个用于测试相等性的运算符。
          猜你喜欢
          • 1970-01-01
          • 2020-08-07
          • 2019-06-05
          • 2011-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多