Check if all items are the same in a List

后端 未结 5 1418
独厮守ぢ
独厮守ぢ 2020-12-02 22:11

I have a List(Of DateTime) items. How can I check if all the items are the same with a LINQ query? At any given time there could be 1, 2, 20, 50 or 100 items in the list.

相关标签:
5条回答
  • 2020-12-02 22:24

    My variant:

    var numUniques = 1;
    var result = list.Distinct().Count() == numUniques;
    
    0 讨论(0)
  • 2020-12-02 22:25

    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;
        }
    
    0 讨论(0)
  • 2020-12-02 22:26

    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.

    0 讨论(0)
  • 2020-12-02 22:29

    Like this:

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

    Or

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

    (which is probably faster)

    0 讨论(0)
  • 2020-12-02 22:45

    VB.NET version:

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

    Or

    If list.Any(Function(d) d <> list(0)) Then
    
    0 讨论(0)
提交回复
热议问题