Non Linq检查列表项的方式是相同的

时间:2013-01-01 09:20:01

标签: c# .net linq list linqbridge

这是Linq检查列表中所有项目是否相同的方法。

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

但是对于早于.NET 3.5开发的应用程序不起作用 以非Linq方式执行此操作的最佳方式是什么。

3 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分:4)

使用Simple 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 Loop。更好的LINQ查询是

list.Skip(1).Any( item => item != list[0]); 

答案 2 :(得分: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上测试。