gpt4 book ai didi

c# - 奇怪的行为 : Added object to ObservableCollection

转载 作者:行者123 更新时间:2023-11-30 15:24:56 25 4
gpt4 key购买 nike

将对象添加到 ObservableCollection 然后查找它时,我遇到了一个奇怪的行为。添加后就发现了,然后使用相同的代码就找不到了?

public class TestClass {
public TestClass(string s) {
Str = s;
}

public string Str {
get;
set;
}
}

private ObservableCollection<TestClass> testCollection = new ObservableCollection<TestClass>();
private List<string> newValueList = new List<string> { "one", "two", "three" };

private void Test() {
var tmpList = newValueList.Select(p => new TestClass(p));

foreach (var v in tmpList) {
testCollection.Add(v);
if (testCollection.Contains(v))
Console.WriteLine("YES");
else
Console.WriteLine("NO");
}

foreach (var v in tmpList) {
if (testCollection.Contains(v))
Console.WriteLine("IN");
else
Console.WriteLine("OUT");
}
}

运行此代码将导致输出:YES YES YES OUT OUT OUT

当使用 .ToList()tmpList 时,您将获得预期的结果。

最佳答案

您定义了一个运行时不知道如何比较它们的类。因此,当它们具有相同的引用而不是相同的 Str 时,它假定它们中的两个是相等的。换句话说,当 ab 时,TestClass 的两个对象 (a,b) 是相等的 是相同的地址。如果你想改变它并使 ab 在它们具有相同的 Str 时相等,你应该覆盖 Equals获取哈希代码You can read more hereherehere

第一部分:

foreach (var v in tmpList) {
testCollection.Add(v);
if (testCollection.Contains(v))
Console.WriteLine("YES");
else
Console.WriteLine("NO");
}

在这里,您将 v 添加到集合中,并检查 v 是否在其中,以便返回“YES”。

第二部分

foreach (var v in tmpList) {
if (testCollection.Contains(v))
Console.WriteLine("IN");
else
Console.WriteLine("OUT");
}

在这里你正在寻找你集合中的 v(这不是对你集合中对象的完全相同的引用(因为惰性评估每次都会在 foreach 迭代中生成新实例))所以它会返回“OUT”!

关于c# - 奇怪的行为 : Added object to ObservableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32096908/

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