Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# 为什么列表的SequenceEqual<;T>;返回false?_C#_List_Comparison - Fatal编程技术网

C# 为什么列表的SequenceEqual<;T>;返回false?

C# 为什么列表的SequenceEqual<;T>;返回false?,c#,list,comparison,C#,List,Comparison,嗨,当我遇到这样的情况时,我有一些问题: Sentence s1 = new Sentence { Text = "Hi", Order = 1 }; Sentence s2 = new Sentence { Text = "Hello", Order = 2 }; List<Sentence> list1 = new List<Sentence> { s1, s2 }; List<Sentence> list2 = new List<Sentence&

嗨,当我遇到这样的情况时,我有一些问题:

Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
Sentence s2 = new Sentence { Text = "Hello", Order = 2 };
List<Sentence> list1 = new List<Sentence> { s1, s2 };
List<Sentence> list2 = new List<Sentence> { s1, s2 };
List<Sentence> list1 = Getall();
List<Sentence> list2 = Getall();
并返回
true

但是当我有一些方法返回
List
例如:

public List<Sentence> Getall()
    {
        Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
        Sentence s2 = new Sentence { Text = "Hello", Order = 2 };

        return new List<Sentence> { s1, s2 };
    }

它返回“false”,请告诉我为什么?你的问题是一个
新句子{Text=“Hi”,Order=1}
不等于另一个
新句子{Text=“Hi”,Order=1}
。尽管内容是相同的,但您有两个独立的对象,除非您设计了类,否则它们彼此不相等,除非它们是字面上相同的对象(如第一个示例中所示)

您的
语句
类需要重写,至少在这一点上,您的
SequenceEquals
应该再次工作。

如下所示:

通过使用元素类型的默认相等比较器对元素进行比较,确定两个序列是否相等。

在您的例子中,
语句是一种引用类型,默认值为
等于
GetHashCode
,这意味着它将对每个元素使用引用相等


每次调用
Getall()
时,您总是可以使用创建两个新句子实例的。比较列表中的元素时,
SequenceEqual
将使用默认的相等比较器,它基本上只是检查它们是否引用sme对象:它们没有引用,因此它们是不同的

您可以做的是依次重写
Equal()
==
运算符,以便对其他属性(如文本和顺序)进行相等检查


或者,您可以编写一个
IEqualityComparer
并将其传递给
SequenceEqual

,因为在第二种情况下,它们是不同的对象,即它们的GetHash()方法返回不同的值。在第一种情况下,它们是具有两个不同引用的完全相同的对象。关于使用比较器而不是在类本身中定义行为的可能性,这一点很好。这个答案很接近,但PatrykĆwiek建议使用IEqualityComparer的答案是我的解决方案。
List<Sentence> list1 = Getall();
List<Sentence> list2 = Getall();
bool equal = list1.SequenceEqual(list2);