【问题标题】:Find an item inside a List<T> by providing a sample object instance通过提供示例对象实例在 List<T> 中查找项目
【发布时间】:2011-08-15 14:36:39
【问题描述】:

为什么有List&lt;T&gt;.Contains(T) 方法而没有List&lt;T&gt;.Find(T) 方法?仅支持支持谓词的Finds。如果我们有一个现有的 T 实例填充了它的 ID 的属性值(但缺少其他属性),为什么我们不能通过提供这个对象实例来搜索 List,尤其是当我们实现自定义 IEquatable&lt;T&gt; 时为T 并想使用那里的东西。但事实上,我们不能,我们必须在 Find(predicate) 调用中重复我们在 IEquatable 实现中所做的一切。

【问题讨论】:

  • 当您已经拥有该实例时,Find(T) 方法的用途是什么?这相当于Contains(T) 方法,因为Find(T) 唯一会告诉您的是该列表是否包含该实例。
  • 我想是因为他试图获取对列表中对象的引用......只是因为他有一个“等于”另一个对象,特别是考虑到他实现了 IEquatable 并且它不仅仅是一个引用比较,这并不意味着他得到了他想要的对象的引用。
  • 正如反理智所说的那样

标签: c# list icollection iequatable


【解决方案1】:

您可以在Predicate&lt;T&gt; 中致电IEquatable&lt;T&gt; 成员。这样你就不会重复自己了。

MyClass a = new MyClass(); //sample for finding; IEquatable<MyClass>
List<MyClass> list = GetInstances();

MyClass found = list.Find( mc => mc.Equals(a) );

【讨论】:

    【解决方案2】:

    这个怎么样

    list.Any(i => i.ID == searchObj.ID);
    

    【讨论】:

      【解决方案3】:

      编辑:

      我想我现在明白了你的问题。为此,您可以使用List&lt;T&gt;.IndexOf 方法:

      int index = myList.IndexOf(mySample);
      
      if(index != -1)
      {
         var item = myList[index];
         // Do something with item.
      }
      

      但这会很奇怪,因为很明显,你的平等定义并不是全部 - 这有点滥用平等,IMO。

      【讨论】:

      • MSDN:此方法使用默认相等比较器 EqualityComparer 确定相等。默认为 T。此方法执行线性搜索;因此,此方法是 O(n) 操作
      • 我的相等定义很好,它只是说两个属性定义相等而不只是一个。
      猜你喜欢
      • 2011-11-30
      • 2012-05-26
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2011-02-09
      • 2012-09-07
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多