C#包含行为

C#包含行为,c#,C#,有人能解释一下为什么这两种方法返回不同的值吗 List<CustomerSummary> summaries = new List<CustomerSummary>(); for (var i = 0; i < 10; i++) { var summary = new CustomerSummary() { ID = 1, Name = "foo", balance = 50.00 }; if (!summaries.Contains(summary))

有人能解释一下为什么这两种方法返回不同的值吗

List<CustomerSummary> summaries = new List<CustomerSummary>();

for (var i = 0; i < 10; i++)
{

var summary = new CustomerSummary() { ID = 1, Name = "foo", balance = 50.00 };

if (!summaries.Contains(summary))
    summaries.Add(summary);

}
列表摘要=新列表();
对于(变量i=0;i<10;i++)
{
var summary=newcustomersummary(){ID=1,Name=“foo”,balance=50.00};
如果(!summaries.Contains(summary))
摘要。添加(摘要);
}
-

列表摘要=新列表();
对于(变量i=0;i<10;i++)
{
var summary=newcustomersummary(){ID=1,Name=“foo”,balance=50.00};
如果(!summaries.Any(s=>s.ID==summary.ID))
摘要。添加(摘要);
}
第一个方法在列表中有10项,而第二个方法有1项。为什么第一个(Contains())方法的计算结果永远不会为true


我想问的是,为什么在第一种方法中,具有相同属性值的相同类型的两个对象的计算结果不等价(在第一种方法中)?

这是因为
Contains()
摘要的引用相匹配。。而不是
ID

每次你做一件事

var summary = new CustomerSummary() { ID = 1, Name = "foo", balance = 50.00 };
在循环中,您创建了
CustomerSummary
的一个新实例,因此在
summary
中存储了一个新引用,认为
CustomerSummary
中每个属性的值都完全相同

if (!summaries.Contains(summary))
这将检查整个图(行)


这将检查您尝试使用的第一个函数中的单个元素
Id=1。

hi包含在整个对象上,而不是像您在第二个函数中所做的那样包含在属性上。请先尝试这样更改

 List<CustomerSummary> summaries = new List<CustomerSummary>();

        for (var i = 0; i < 10; i++)
        {

            var summary = new CustomerSummary() { ID = 1, Name = "foo", balance = 50.00 };

            if (!summaries.Select(s=>s.ID).Contains(summary.ID))
                summaries.Add(summary);

        }
列表摘要=新列表();
对于(变量i=0;i<10;i++)
{
var summary=newcustomersummary(){ID=1,Name=“foo”,balance=50.00};
如果(!summaries.Select(s=>s.ID).Contains(summary.ID))
摘要。添加(摘要);
}

您的第一个代码块是在循环中创建一个新实例,然后立即检查该实例是否已在集合中。不可能,你只是创造了它

你不妨这样写:

List<CustomerSummary> summaries = new List<CustomerSummary>();

for (var i = 0; i < 10; i++)
{
    var summary = new CustomerSummary { ID = 1, Name = "foo", balance = 50.00 };

    summaries.Add(summary);
}

同样地,
if
语句不再是必需的,因为您知道该ID不可能已经存在于集合中,所以您可以删除该检查。

方法通过使用默认的相等比较器来确定相等。在这里,你试着比较两个不同的物体。两者都可以用匹配值填充所有属性,但这是两个不同的对象。如果要在此处真正使用Contains方法,必须在
CustomerSummary
对象中实现该方法

也许这就是我不理解的部分——例子。为什么两个类型相同且每个属性的值相同的对象不能作为等效对象进行计算?谢谢,这很有帮助:)
 List<CustomerSummary> summaries = new List<CustomerSummary>();

        for (var i = 0; i < 10; i++)
        {

            var summary = new CustomerSummary() { ID = 1, Name = "foo", balance = 50.00 };

            if (!summaries.Select(s=>s.ID).Contains(summary.ID))
                summaries.Add(summary);

        }
List<CustomerSummary> summaries = new List<CustomerSummary>();

for (var i = 0; i < 10; i++)
{
    var summary = new CustomerSummary { ID = 1, Name = "foo", balance = 50.00 };

    summaries.Add(summary);
}
for (var i = 0; i < 10; i++)
{
    var summary = new CustomerSummary { ID = i, Name = "foo", balance = 50.00 };

    if (!summaries.Any(s=> s.ID == summary.ID))
        summaries.Add(summary);
}