有人可以解释为什么这两种方法返回不同的值?
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个相同类型的对象具有相同的值,每个属性没有评估为等价(在第一种方法中)?
您的第一个代码块是在循环内创建一个新实例,然后立即检查该实例是否已在集合中。它不可能——你刚刚创造了它。
你不妨这样写:
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 不可能已经存在于集合中,因此您可以删除该检查。