[英]Union of two ObservableCollections returns duplicates
我试图派生两个ObservableCollections的联合,联合中的项目不是唯一的。
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
namespace ObservableCollectionUnion
{
class Program
{
class Option { public string Code; }
static void Main(string[] args)
{
Option[] opts1 = {
new Option { Code = "1" },
new Option { Code = "2" },
};
Option[] opts2 = {
new Option { Code = "2" },
new Option { Code = "3" },
};
ObservableCollection<Option> obsOpts1 = new ObservableCollection<Option>(opts1);
ObservableCollection<Option> obsOpts2 = new ObservableCollection<Option>(opts2);
ObservableCollection<Option> obsOptsBoth = new ObservableCollection<Option>(obsOpts1.Union(obsOpts2));
foreach (Option opt in obsOptsBoth) {
Debug.WriteLine(opt.Code);
}
}
}
}
输出为:
1
2
2
3
我如何获得1,2,3? 我尝试传递IComparer或IEqualityComparer,但出现错误
Error CS1929 'ObservableCollection<Program.Option>' does not contain a definition for 'Union' and the best extension method overload 'Queryable.Union<Program.Option>(IQueryable<Program.Option>, IEnumerable<Program.Option>, IEqualityComparer<Program.Option>)' requires a receiver of type 'IQueryable<Program.Option>'
这是我正在尝试做的:
using System;
using System.Collections;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
namespace ObservableCollectionUnion
{
class Program
{
class Option { public string Code; }
class OptionComparer : IEqualityComparer
{
public new bool Equals(object x, object y)
{
return Convert.ToInt32(((Option)x).Code) == Convert.ToInt32(((Option)y).Code);
}
public int GetHashCode(object obj)
{
return ((Option)obj).Code.GetHashCode();
}
}
static void Main(string[] args)
{
Option[] opts1 = {
new Option { Code = "1" },
new Option { Code = "2" },
};
Option[] opts2 = {
new Option { Code = "2" },
new Option { Code = "3" },
};
ObservableCollection<Option> obsOpts1 = new ObservableCollection<Option>(opts1);
ObservableCollection<Option> obsOpts2 = new ObservableCollection<Option>(opts2);
ObservableCollection<Option> obsOptsBoth = new ObservableCollection<Option>(obsOpts1.Union(obsOpts2, new OptionComparer()));
foreach (Option opt in obsOptsBoth) {
Debug.WriteLine(opt.Code);
}
}
}
}
有趣的是,我正在遵循智能感知告诉我的内容。 它说ObservableCollection.Union有一个签名
public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer);
它不会返回重复项。 如果你做了类似的事情
var commonOption = new Option { Code = "2" }
并将其用于可观察的集合中,它将按预期工作。 默认情况下,仅当它们是同一实例时,类才相等。 如果需要其他种类的相等性,则可以通过覆盖相等性运算符来定义它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.