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

本文关键字:获取 视图 集合 | 更新日期: 2023-09-27 18:14:15

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

我有一个像上面一样的集合视图。问题是已绑定到列表视图的集合 MyData 包含重复项。如何获得筛选后的独特项目?

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

你可以试试这个

var g = collection.Select(i => i.Property1).Distinct();

如果有效,请提供反馈。

看起来我在找出适合您需求的最佳解决方案时迟到了。无论如何,我提供它是因为它比公认的更干净、更快。

首先像往常一样,让我们定义一个封装逻辑的函数

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);

此方法有效:

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.

因此,您基本上可以比较当前elementindex是否是最后一个发生。

这对于简单类型并不自然地起作用。我必须像这样初始化我的测试集合:

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

除了谭@Sebastian的答案

var g = collection.Select(i => i.Property1).Distinct();

如果集合是来自您自己的用户定义类的序列,则需要实现 IEquatable 接口 for Distinct 以使用默认的比较器。

看看这篇文章

集合类型的默认相等比较器是什么?