检查所有列表项在C#中是否具有相同的成员值

时间:2011-08-05 12:16:26

标签: c#

我正在寻找一种简单快捷的方法来检查我的所有Listitems是否具有相同的成员价值。

foreach (Item item in MyList)
{
    Item.MyMember = <like all other>;
}

修改 我忘记了一件事:如果其中一个成员(它的一个字符串)是String.Empty而所有其他项目都有相同的字符串它也应该是真的!对不起,我忘了这个。

6 个答案:

答案 0 :(得分:25)

编辑:好的,新要求之后

bool allSame = !MyList.Select(item => item.MyMember)
                      .Where(x => !string.IsNullOrEmpty(x))
                      .Distinct()
                      .Skip(1)
                      .Any();

这可以避免您必须首先找到一个样本值。 (当然,它会在找到第二个值时立即退出。)

只迭代序列一次,如果它不是一个可重复的序列,这可能很重要。如果它当然是List<T>,那不是问题。

编辑:从文档中消除对Skip的疑虑:

  

如果 source 包含少于 count 元素,则返回空IEnumerable<T>。如果 count 小于或等于零,则会产生 source 的所有元素。

答案 1 :(得分:5)

你自己的解决方案已经足够简单,但如果你想抽象出循环并更有表现力地写它,你可以使用Linq。

bool allSame = MyList.All(item => item.MyMember == someValue);

答案 2 :(得分:4)

using System.Linq;
…

if (myList.Any()) // we need to distinguish between empty and non-empty lists 
{
    var value = myList.First().MyMember;
    return myList.All(item => item.MyMember == value);
}
else
{
    return true;  // or false, if that is more appropriate for an empty list    
}

答案 3 :(得分:0)

这是一个适用于从2.0开始的所有.NET版本的通用版本:

public static bool AllSameByProperty<TItem, TProperty>(IEnumerable<TItem> items, Converter<TItem, TProperty> converter)
{
    TProperty value = default(TProperty);
    bool first = true;

    foreach (TItem item in items)
    {
        if (first)
        {
            value = converter.Invoke(item);
            first = false;
            continue;
        }

        TProperty newValue = converter.Invoke(item); 

        if(value == null)
        {
            if(newValue != null)
            {
                return false;
            } 

            continue;
        }

        if (!value.Equals(newValue))
        {
            return false;
        }
    }

    return true;
}

在C#2.0中的用法:

AllSameByProperty(list, delegate(MyType t) { return t.MyProperty; });

在C#3.0中的用法:

AllSameByProperty(list, t => t.MyProperty);

答案 4 :(得分:0)

我这样做:

Item item = MyList.FirstOrDefault(x=>x.MyMember != valueToMatch);
bool allMembersSame = item == null;

答案 5 :(得分:-1)

我认为这是最短,最优雅的解决方案:

bool allSame = list.GroupBy(item => item.TheProperty).Count == 1;