检查List是否包含与给定实例相等的实例

Clo*_*eto 2 c# instance

我不想遍历列表比较每个属性.具有此功能的东西:

class myClass
{
    public int I { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<myClass> l = new List<myClass>();

        myClass x = new myClass();
        x.I = 1;
        l.Add(x);

        myClass y = new myClass();
        y.I = 2;
        l.Add(y);

        myClass z = new myClass();
        z.I = 2;

        if (l.ContainsAnInstanceEqualTo(z))
            Console.WriteLine("Contains");

        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

重要提示:我无法控制该类,并且有一些属性应该具有相同的值.

Jon*_*eet 8

你应该制作myClass工具IEquatable<myClass>(或至少覆盖Equals(object)),然后只使用:

if (l.Contains(z))
Run Code Online (Sandbox Code Playgroud)

(您还应该重命名该类以遵循.NET命名约定...)

如果你不提供Equals方法,你必须以某种方式指定你感兴趣的那种平等.你可以通过类似Find谓词来做到这一点:

var found = l.Find(c => c.I == z.I);
if (found != null)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者使用LINQ:

var any = l.Any(c => c.I == z.I);
Run Code Online (Sandbox Code Playgroud)

但它会是更好的覆盖Equals,如果有平等的自然感.

(List<T>.Contains不会使用你的实现GetHashCode,但你应该按照你的Equals方法实现它...)

  • @Clodoaldo:你在寻找类似的东西吗?`var any = l.Any(c => cI == zI && c.II = z.II && c.III = z.III);` (2认同)