gpt4 book ai didi

.net - LinkedList.Contains。比较对象的方法是什么?

转载 作者:行者123 更新时间:2023-12-01 10:15:01 26 4
gpt4 key购买 nike

LinkedList.Contains 方法。 (.NET 2)

里面的对象是怎么比较的? (等于?CompareTo?)

MSDN 什么也没说。

情况:

interface IClass
{
string GetName();
}

class Class1 : IClass, IEquatable<Class1>
{
public string FirstName;
public string LastName;

string IClass.GetName() { return FirstName; }

bool IEquatable<Class1>.Equals(Class1 other)
{
return FirstName.Equals(other.FirstName);
}
}

class Class2 : IClass, IEquatable<Class2>
{
public string FirstName;
public string LastName;

string IClass.GetName() { return LastName; }

bool IEquatable<Class2>.Equals(Class2 other)
{
return LastName.Equals(other.LastName);
}
}

public void TestMethod()
{
Class1 c1 = new Class1();
c1.FirstName = "fn";
c1.FirstName = "ln";

Class2 c2 = new Class2();
c2.FirstName = "fn";
c2.FirstName = "ln";

Class1 c3 = new Class1();
c3.FirstName = "fn";
c3.FirstName = "ln";

LinkedList<IClass> myList = new LinkedList<IClass>();
myList.AddFirst(c1);
myList.AddFirst(c2);
// false here
MessageBox.Show("myList<IClass> contains c3? - " + (myList.Contains(c3)));

LinkedList<Class1> myList1 = new LinkedList<Class1>();
myList1.AddFirst(c1);
myList1.AddFirst(c1);
// true here
MessageBox.Show("myList1<Class1> contains c3? - " + (myList1.Contains(c3)));
}

最佳答案

因为链表不是字典,所以我期望它使用EqualityComparer<T>.Default.Equals(x,y) .

这支持(按顺序):

  • IEquatable<T> (对于有问题的 T)
  • object.Equals (默认使用引用相等性,或支持覆盖 Equals(object) )

请注意 EqualityComparer<T>还处理通常的 null两个类和Nullable<T>的规则等.

(更新:已检查并更正;来自 Find(T))

...
EqualityComparer<T> comparer = EqualityComparer<T>.Default;
...
if (comparer.Equals(head.item, value)) {...}
...

更新以证明此功能在 ISomeInterface: IEquatable<ISomeInterface> 时有效,根据评论:

using System;
using System.Collections.Generic;


class Program
{
static void Main()
{
LinkedList<IFoo> foos = new LinkedList<IFoo>();
foos.AddLast(new Foo1("abc"));
foos.AddLast(new Foo2("def"));
Console.WriteLine("checking contains...");
bool c = foos.Contains(new Foo1("ghi"));
Console.WriteLine("...done");
}
}
interface IFoo : IEquatable<IFoo>
{
void Bar();
}
class Foo1 : IFoo
{
public string Value { get; set; }
public Foo1(string value) { Value = value; }
public override bool Equals(object other)
{
Console.WriteLine(Value + " > override Equals");
return base.Equals(other);
}
bool IEquatable<IFoo>.Equals(IFoo other)
{
Console.WriteLine(Value + " > explicit Equals");
return base.Equals(other);
}
public void Bar() { }
public override int GetHashCode() { return base.GetHashCode(); }
}
class Foo2 : IFoo
{
public string Value { get; set; }
public Foo2(string value) { Value = value; }
public override bool Equals(object other)
{
Console.WriteLine(Value + " > override Equals");
return base.Equals(other);
}
public bool Equals(IFoo other)
{
Console.WriteLine(Value + " > implicit Equals");
return base.Equals(other);
}
public void Bar() { }
public override int GetHashCode() { return base.GetHashCode(); }
}

关于.net - LinkedList.Contains。比较对象的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1755347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com