假设我有以下对象:
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
,如果是,那么如何?
答案 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();
}