web-dev-qa-db-ja.com

リスト内のすべてのアイテムが同じかどうかを確認します

List(Of DateTime)アイテムがあります。 LINQクエリですべてのアイテムが同じであるかどうかを確認するにはどうすればよいですか?いつでも、リストには1、2、20、50、または100個のアイテムがあります。

ありがとう

55
Saif Khan

このような:

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

または

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

(おそらく高速です)

90
SLaks

主に読みやすいように、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;
    }
8
MSkuta

VB.NETバージョン:

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

または

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

これもオプションです。

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

if (list.Distinct().Skip(1).Any())よりも高速で、if (list.Any(o => o != list[0]))と同様に動作しますが、違いはそれほど重要ではないため、より読みやすいものを使用することをお勧めします。

2
KungFury

私のバリアント:

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