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

Sai*_*han 55 c# vb.net linq-to-objects list

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

谢谢

SLa*_*aks 95

像这样:

if (list.Distinct().Skip(1).Any())
Run Code Online (Sandbox Code Playgroud)

要么

if (list.Any(o => o != list[0]))
Run Code Online (Sandbox Code Playgroud)

(这可能更快)

  • 使用"全部"代替"任何"可能更容易阅读.如果无法执行列表访问(IEnumerable),您可能还想使用First()而不是[0].if(list.All(o => o == list.First())){...} (19认同)
  • `list.Distinct().跳过(1).Any()`和`list.Distinct()没有区别.计数!= 1`对吗? (2认同)
  • @Simon_Weaver`Any()`用于查找至少1个匹配,而'All()`用于确保所有项匹配.在任何一种情况下,如果在All中遇到不匹配或在Any中找到匹配,则它们将停止迭代.所以`!(list.Any(o => o!= list [0]));`和`list.All(o => o == list [0]);`将始终具有相同的迭代计数.因此两者将具有大约相同的执行时间.PS你是正确的,在那个`list.Distinct().跳过(1).Any()`类似于`list.Distinct().计数!= 1`只是要知道Count可能比Any慢(甚至可能在这种情况下)> 1元素. (2认同)

MSk*_*uta 9

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

if (items.AreAllSame()) ...
Run Code Online (Sandbox Code Playgroud)

方法实现:

    /// <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;
    }
Run Code Online (Sandbox Code Playgroud)


VBo*_*off 9

我的变种:

var numUniques = 1;
var result = list.Distinct().Count() == numUniques;
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个,与skip1/any 解决方案相比,它非常具有可读性并且显示出意图。 (3认同)

小智 5

这也是一种选择:

 if (list.TrueForAll(i => i.Equals(list.FirstOrDefault())))
Run Code Online (Sandbox Code Playgroud)

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