Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 覆盖.NET通用列表<;MyType>;。是否包含(MyTypeInstance)?_C#_.net_List - Fatal编程技术网

C# 覆盖.NET通用列表<;MyType>;。是否包含(MyTypeInstance)?

C# 覆盖.NET通用列表<;MyType>;。是否包含(MyTypeInstance)?,c#,.net,list,C#,.net,List,有可能吗?如果有,我如何覆盖正常的列表的Contains方法,其中T是我自己的自定义类型?您需要覆盖类(MyType)中的Equals和GetHashCode。如果您实现自定义类型的Equals,List的contains函数将起作用来实现您自己的contains实现。您可以创建一个实现ILST接口的类。这样你的班级就会看起来像一个IList。你可以在内部有一个真正的清单来做标准的事情 class MyTypeList : IList<MyType> { private Li

有可能吗?如果有,我如何覆盖正常的
列表的
Contains
方法,其中
T
是我自己的自定义类型?

您需要覆盖类(
MyType
)中的
Equals
GetHashCode

如果您实现自定义类型的Equals,List的contains函数将起作用

来实现您自己的contains实现。您可以创建一个实现ILST接口的类。这样你的班级就会看起来像一个IList。你可以在内部有一个真正的清单来做标准的事情

class MyTypeList : IList<MyType>
{
    private List<MyType> internalList = new ...;

    public bool Contains(MyType instance)
    {

    }

    ....
}
类MyTypeList:IList
{
私有列表内部列表=新。。。;
公共bool包含(MyType实例)
{
}
....
}
列表
使用
EqualityComparer.Default
进行比较;这首先检查对象是否实现了
IEquatable
;否则is使用
对象。等于

所以,;最简单的方法是重写
Equals
(始终更新
GetHashCode
,以匹配
Equals
中的逻辑)。或者,改用LINQ:

bool hasValue = list.Any(x => x.Foo == someValue);

根据覆盖中的具体需要,您可以使用Linq表达式来实现这一点:

list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need

然后,为了方便起见,您可以将其包装在扩展方法中。

No,List永远不会使用==运算符;不过,只有平等的人才不认为它值得一票否决。平等是正确的;修正了(+1)您的问题中有点不清楚您需要实现什么。你是a)需要标准的Contains来处理你的自定义类型,还是b)在调用Contains时做一些特殊的逻辑?Peter,基本上我的列表在运行时不在内存中,它对OODBMS的引用比较松散/弱。如果我在列表上执行本机.net.Contains,它将从oodbms后端检索整个列表,并在本地进行计算。因此,我想用适当的(后端)查询语法来覆盖它。@Jörg-因此,考虑到这一点,覆盖Equals/GetHashCode如何解决您的问题(@Cans answer)?它没有。。。过早地给出了“已解决的”。。。我最后/基本上做的是为List编写一个扩展方法,该方法在内部使用oodbms查询语法检查是否存在。oodbms对接口更改非常敏感,并且在添加新的迁移路径时需要迁移路径&目前我并不真正需要。然而,你的答案是,让我朝着正确的方向前进。谢谢@Marc Gravell:如果我想测试两个只包含属性和字段的自定义类的“相等性”,我需要在我的类中实现IEquatable?当我假设两个类被认为是“相等”的时候,我一定很累了,因为每个类中的字段包含相同的值。。。谢谢你的提示;)@马克·格雷威尔:好吧,从技术上讲,它们包含什么并不重要。重要的是,我“正确”实现了IEquatable,并选择了一个字段,该字段应指示另一个MyClass是否被视为相等。@dboarman-完全正确。这是你的第一点,IIRC结构确实是这样的,所以你离这里不远。