2

これは、リスト内のすべての項目が同じかどうかを確認する Linq の方法です。

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

ただし、.NET 3.5 より前に開発されたアプリケーションでは機能しません。Linq 以外の方法で行う最適な方法は何ですか。

4

3 に答える 3

8

あなたはただ行うことができます:

public bool AllEqual<T>(IEnumerable<T> items)
{
    // This could be a parameter if you want
    var comparer = EqualityComparer<T>.Default;
    using (var iterator = items.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            return true; // Empty sequence
        }
        var first = iterator.Current;
        while (iterator.MoveNext())
        {
            if (!comparer.Equals(first, iterator.Current))
            {
                return false;
            }
        }
    }
    return true;
}

これは、リストだけでなく、すべてのシーケンス タイプで機能します。リストの場合、実際には少し単純です。

public bool AllEqual<T>(IList<T> items)
{
    // This could be a parameter if you want
    var comparer = EqualityComparer<T>.Default;
    for (int i = 1; i < items.Count; i++)
    {
        if (!comparer.Equals(items[0], items[i]))
        {
            return false;
        }
    }
}
于 2013-01-01T09:25:19.293 に答える
4

単純な For ループの使用。

var allSame = true;
for(int i=1 ; i < list.Count ; i++)
{
   if ( list[0] != list[i] )
   { 
     allSame = false;
     break;
   }
}

.NET 2.0 で Linq を使用する場合は、LinqBridgeを使用できます。

しかし、LINQ クエリ自体は最適ではありません。最適なのは For ループです。より良いLINQクエリは

list.Skip(1).Any( item => item != list[0]); 
于 2013-01-01T09:25:33.437 に答える
3

少し短いもの:

public static bool AllSame<T>(List<T> list)
{
    return list.Count == 0 || list.FindAll(delegate(T x)
        { return !EqualityComparer<T>.Default.Equals(x, list[0]); }).Count == 0;
}

新しい Framework 2.0 プロジェクトを使用して VS2012 でテスト済み。

于 2013-01-01T09:46:55.103 に答える