CollectionView view = CollectionView)CollectionViewSource.GetDefaultView(MyData);
View.Filter = i => ((MyClass)i).MyProperty;
我有一个像上面这样的集合视图。问题是已绑定到列表视图的集合MyData包含重复项。如何通过过滤获得唯一项目?
答案 0 :(得分:2)
你可以试试这个
Image
请提供反馈,如果有效的话。
答案 1 :(得分:2)
在找出符合您需求的最佳解决方案时,我似乎已经迟到了。无论如何,我提供它是因为它比接受的更干净,更快。
首先像往常一样定义一个封装逻辑
的函数static bool IsDuplicate(IEnumerable<MyObject> collection, MyObject target)
{
foreach (var item in collection)
{
// NOTE: Check only the items BEFORE the one in question
if (ReferenceEquals(item, target)) break;
// Your criteria goes here
if (item.MyProperty == target.MyProperty) return true;
}
return false;
}
然后使用它
var view = (CollectionView)CollectionViewSource.GetDefaultView(MyData);
view.Filter = item => !IsDuplicate((IEnumerable<MyClass>)view.SourceCollection, (MyClass)item);
答案 2 :(得分:1)
除了@Sebastian Tam的回答
var g = collection.Select(i => i.Property1).Distinct();
如果collection是来自您自己的用户定义类的序列,则需要实现IEquatable Interface for Distinct以使用默认的Comparer。
看一下这篇文章
答案 3 :(得分:1)
此方法有效:
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(c.Items);
view.Filter = i =>
{
var index1 = c.MyData.FindIndex(delegate (MyClass s)
{
return Object.ReferenceEquals(s, i);
});
var index2 = c.MyData.FindLastIndex(delegate (MyClass s)
{
return ((MyClass)i).MyProperty == s.MyProperty as string; //value comparison
});
return index1 == index2;
};
index1
是集合中对象的索引。您需要比较references
才能获得该结果。
index2
是value
的最后一个索引。在那里你需要比较value
。
因此,您基本上会比较当前index
的{{1}}是否是最后一个element
。
注意:
这与简单类型无关。我必须像这样初始化我的测试集合:
new List<string>() { new string("I1".ToCharArray()), new string("I1".ToCharArray()), "I2" };