确定如果“字典”对中的所有值都相等

时间:2014-07-28 20:27:30

标签: c# dictionary

我有一个由点和力组成的字典,如下所示:

public Dictionary<Point, Force> PointForceSet;

我想写一个函数,告诉我包含的所有力是否相同。到目前为止,我有这个:

public bool IsUniform()
{

    foreach (var item in PointForceSet)
    {
       //?
    }
}

确定键值对中的所有值是否相等的最简单方法是什么?

6 个答案:

答案 0 :(得分:4)

如果您的值具有有意义的默认比较器(如数字),那就足够了:

public bool IsUniform()
{    
    return PointForceSet.Values.Distinct().Count() == 1;
}

但如果有类(例如Force),请记得覆盖GetHashCodeEquals,以便真正区分Force个对象实例,fe:

class Force
{
    public int X;
    public int Y;

    public override bool Equals(object obj)
    {
        Force other = obj as Force;
        return other != null && X == other.X && Y == other.Y;
    }

    public override int GetHashCode()
    {
        return 17 * X + Y;
    }
}

答案 1 :(得分:3)

您可以使用LINQ提取第一个值,并检查以确保其他值匹配:

public bool IsUniform()
{
    var values = PointForceSet.Values;
    if (values.Count == 0)
        return false; // Normally would be true - handling your req. based on comments

    var first = values.First();
    return values.Skip(1).All(v => v.Equals(first));
}

答案 2 :(得分:1)

你应该致电

PointForceSet.Distinct() 

传入

IEqualityComparer<KeyValuePair<Point, Force>> 

实现。

如果字典中有项目,而.Distinct()只返回一个项目,则所有项目都是&#34;相同的&#34;根据你的比较代码。

答案 3 :(得分:1)

为了在发现不相等的一对时允许短路,理想的解决方案是简单地遍历序列,将每个项目与第一个项目进行比较。

public static bool AreSame<T>(this IEnumerable<T> source,
    IEqualityComparer<T> comparer)
{
    comparer = comparer ?? EqualityComparer<T>.Default;
    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
            return true;
        var first = iterator.Current;
        while (iterator.MoveNext())
            if (!comparer.Equals(first, iterator.Current))
                return false;
        return true;
    }
}

请注意,迭代器的显式枚举用于防止序列多次迭代,以及支持空序列。

答案 4 :(得分:0)

如果Force类覆盖EqualsGetHashCode方法,则此方法应该有效。否则实现IEqualityComparer并将其传递给构造函数

public bool IsUniform()
{    
    return new HashSet<Force>(PointForceSet.Values).Count == 1;
}

答案 5 :(得分:0)

使用HashSet<Force>的另一种有效方式:

public bool IsUniform(ICollection<Force> forces)
{
    if (forces == null) throw new ArgumentNullException("forces");
    if (!forces.Any()) return false;
    var set = new HashSet<Force> { forces.First() };
    return set.SetEquals(forces);
}

// ...
bool allEqual = IsUniform(PointForceSet.Values);

有效,因为您已将Equals + GetHashCode覆盖为已评论。

相关问题