Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在列表中查找项目<;T>;通过提供一个示例对象实例_C#_List_Icollection_Iequatable - Fatal编程技术网

C# 在列表中查找项目<;T>;通过提供一个示例对象实例

C# 在列表中查找项目<;T>;通过提供一个示例对象实例,c#,list,icollection,iequatable,C#,List,Icollection,Iequatable,为什么有一个List.Contains(T)方法而没有List.Find(T)方法?只支持支持支持谓词的Finds。如果我们有一个T的现有实例,它的ID填充了一个属性值(但缺少其他属性),那么为什么我们不能通过在列表中为搜索提供这个对象实例来进行搜索,特别是当我们为T实现了自定义IEquatable并且想要使用其中的内容时。但事实上,我们不能,我们必须重复我们在Find(predicate)调用中在IEquatable实现中所做的一切。您可以调用谓词中的IEquatable成员。那你就不会重复你

为什么有一个
List.Contains(T)
方法而没有
List.Find(T)
方法?只支持支持支持谓词的
Find
s。如果我们有一个T的现有实例,它的ID填充了一个属性值(但缺少其他属性),那么为什么我们不能通过在
列表中为搜索提供这个对象实例来进行搜索,特别是当我们为
T
实现了自定义
IEquatable
并且想要使用其中的内容时。但事实上,我们不能,我们必须重复我们在
Find(predicate)
调用中在
IEquatable
实现中所做的一切。

您可以调用
谓词中的
IEquatable
成员。那你就不会重复你自己了

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

MyClass found = list.Find( mc => mc.Equals(a) );
MyClass a=新的MyClass()//用于查找的样本;充足的
List=GetInstances();
MyClass-found=list.Find(mc=>mc.Equals(a));
这个怎么样

list.Any(i => i.ID == searchObj.ID);
编辑:

我想我现在明白你的问题了。为此,您可以使用该方法:

int index = myList.IndexOf(mySample);

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

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

当你已经有了这个实例时,
Find(t)
方法有什么用?这相当于
Contains(T)
方法,因为
Find(T)
唯一能告诉您的是该列表是否包含该实例。。。仅仅因为他有一个与另一个“相等”的对象,特别是考虑到他实现了IEquatable,这不仅仅是一个参考比较,这并不意味着他得到了他想要的对象的引用。正如antisanity所说的msdn:此方法使用默认的相等比较器EqualityComparer确定相等。默认为t。此方法执行线性搜索;因此,这个方法是一个O(n)运算。我的等式定义很好,它只是说两个属性定义了等式,而不是一个。