检查列表中的所有项目是否相同

时间:2011-03-15 03:21:42

标签: c# vb.net list linq-to-objects

我有一个List(Of DateTime)项目。如何检查所有项目是否与LINQ查询相同?在任何给定时间,列表中可能有1,2,20,50或100个项目。

由于

5 个答案:

答案 0 :(得分:88)

像这样:

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

或者

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

(可能更快)

答案 1 :(得分:7)

我创建了简单的扩展方法,主要是为了可读性,适用于任何IEnumerable。

if (items.AreAllSame()) ...

方法实现:

    /// <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;
    }

答案 2 :(得分:2)

这也是一个选项:

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

它比if (list.Distinct().Skip(1).Any())快,并且表现得与...相似   if (list.Any(o => o != list[0]))但是,差异并不显着,所以我建议使用更易读的。

答案 3 :(得分:1)

VB.NET版本:

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

或者

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

答案 4 :(得分:0)

我的变体:

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