C#包含行为

use*_*446 6 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))
    summaries.Add(summary);

}
Run Code Online (Sandbox Code Playgroud)

-

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.Any(s=> s.ID == summary.ID))
     summaries.Add(summary);

}
Run Code Online (Sandbox Code Playgroud)

第一种方法在列表中有10项,而第二种方法有1.为什么第一种(Contains())方法永远不会评估为真?

我想问的是为什么2个相同类型的对象具有相同的值,每个属性没有评估为等价(在第一种方法中)?

Gra*_*ICA 3

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

你不妨这样写:

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);
}
Run Code Online (Sandbox Code Playgroud)

第二个代码块是检查集合中是否存在具有匹配 ID 的任何项目。由于您已将 ID 硬编码为 1,因此您只需在第一次添加项目即可。此后创建的每个实例都会在if语句中返回 false,并且不会被添加。

您可以通过更改 ID 来更改该行为:

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);
}
Run Code Online (Sandbox Code Playgroud)

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