检查 List 中的所有项是否相同

我有一个列表(日期时间)项目。如何用 LINQ 查询检查所有项目是否相同?在任何给定的时间可能有1,2,20,50或100个项目的清单。

84381 次浏览

Like this:

if (list.Distinct().Skip(1).Any())

Or

if (list.Any(o => o != list[0]))

(which is probably faster)

VB.NET version:

If list.Distinct().Skip(1).Any() Then

Or

If list.Any(Function(d) d <> list(0)) Then

I created simple extension method mainly for readability that works on any IEnumerable.

if (items.AreAllSame()) ...

And the method implementation:

    /// <summary>
///   Checks whether all items in the enumerable are same (Uses <see cref="object.Equals(object)" /> to check for equality)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="enumerable">The enumerable.</param>
/// <returns>
///   Returns true if there is 0 or 1 item in the enumerable or if all items in the enumerable are same (equal to
///   each other) otherwise false.
/// </returns>
public static bool AreAllSame<T>(this IEnumerable<T> enumerable)
{
if (enumerable == null) throw new ArgumentNullException(nameof(enumerable));


using (var enumerator = enumerable.GetEnumerator())
{
var toCompare = default(T);
if (enumerator.MoveNext())
{
toCompare = enumerator.Current;
}


while (enumerator.MoveNext())
{
if (toCompare != null && !toCompare.Equals(enumerator.Current))
{
return false;
}
}
}


return true;
}

This is an option, too:

 if (list.TrueForAll(i => i.Equals(list.FirstOrDefault())))

It is faster than if (list.Distinct().Skip(1).Any()) , and performs similarly as if (list.Any(o => o != list[0])), however, the difference is not significant, so I suggest using the more readable one.

My variant:

var numUniques = 1;
var result = list.Distinct().Count() == numUniques;