我有一个由点和力组成的字典,如下所示:
public Dictionary<Point, Force> PointForceSet;
我想写一个函数,告诉我包含的所有力是否相同。到目前为止,我有这个:
public bool IsUniform()
{
foreach (var item in PointForceSet)
{
//?
}
}
确定键值对中的所有值是否相等的最简单方法是什么?
答案 0 :(得分:4)
如果您的值具有有意义的默认比较器(如数字),那就足够了:
public bool IsUniform()
{
return PointForceSet.Values.Distinct().Count() == 1;
}
但如果有类(例如Force
),请记得覆盖GetHashCode
和Equals
,以便真正区分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
类覆盖Equals
和GetHashCode
方法,则此方法应该有效。否则实现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
覆盖为已评论。