我正在寻找一种简单快捷的方法来检查我的所有Listitems是否具有相同的成员价值。
foreach (Item item in MyList)
{
Item.MyMember = <like all other>;
}
修改 我忘记了一件事:如果其中一个成员(它的一个字符串)是String.Empty而所有其他项目都有相同的字符串它也应该是真的!对不起,我忘了这个。
答案 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;