C# - 如何从集合视图中获取不同的项目

时间:2015-09-24 08:21:18

标签: c# distinct collectionview

CollectionView view = CollectionView)CollectionViewSource.GetDefaultView(MyData);
View.Filter = i => ((MyClass)i).MyProperty;

我有一个像上面这样的集合视图。问题是已绑定到列表视图的集合MyData包含重复项。如何通过过滤获得唯一项目?

4 个答案:

答案 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。

看一下这篇文章

What is the default equality comparer for a set type?

答案 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才能获得该结果。

index2value的最后一个索引。在那里你需要比较value

因此,您基本上会比较当前index的{​​{1}}是否是最后一个element

注意

这与简单类型无关。我必须像这样初始化我的测试集合:

new List<string>() { new string("I1".ToCharArray()), new string("I1".ToCharArray()), "I2" };