MyObject-list中的每个Property-Value必须是唯一的

时间:2015-09-24 08:32:02

标签: c# linq list unique equals

假设我有以下对象:

public class MyObject
{
    public string MyValue { get; set; }
}

在另一个班级,我有一个这些对象的列表:

public class MyClass
{
    private List<MyObject> _list;

    public MyClass(List<MyObject> myObjects)
    {
        _list = myObjects;
    }

    public bool AllUniqueValues()
    {
        ...
    }
}

我想检查列表中的所有MyObject是否都有唯一的(非重复的)Value。当我使用以下内容时,它可以工作:

public bool AllUnique()
{
    return _list.All(x => _list.Count(y => String.Equals(y.Value, x.Value)) == 1);
}

但我觉得这可以做得更容易/更优雅。所以,我的问题是,是否有更好/更优雅的方法来检查所有MyObjects是否都有非重复的Value,如果是,那么如何?

4 个答案:

答案 0 :(得分:3)

我发现这很优雅:

 var allUnique = _list.AllUnique(i => i.MyValue);

现在您的代码变为:

"(something)".split("\\W+")

答案 1 :(得分:1)

其中一种方法:

return !_list.GroupBy(c=>c.MyValue).Any(c=>c.Count() > 1);

至少它更清楚一点。

答案 2 :(得分:0)

解决此问题的最优雅方法是使用 set 数据结构。无序的独特元素集合。在.NET中,您需要使用HashSet<T>

您可以覆盖Equals的{​​{1}}和GetHashCode,以提供您的情况中的平等含义,或实施MyObject

如果您实例化IEqualityComparer<T>并且未提供HashSet<T>实现,那么它将使用您的覆盖,否则它将使用整个实现。通常,如果同一对象的相等的含义不止,则实现相等比较器。

我可能仍然需要有序的元素集合

如果您仍然需要按顺序存储对象,则可以将这些元素并行存储在IEqualityComparer<T>HashSet<T>中。当您需要检查项目是否存在,获取项目或在集合中执行一些支持的操作时,List<T>HashSet<T>项的实际O(1)访问权限是实际的typedef enum { WHITE = 0, BLACK, BLUE, RED, YELLOW } colors_t;访问权限,因为它是一个哈希集合,它赢得了'需要完全迭代才能找到元素。

答案 3 :(得分:0)

有很多方法可以做到,但就个人而言,我会做以下事情:

public bool AllUnique()
{
    return _list.GroupBy(x => x.MyValue).Count() == _list.Count();
}