我有一个Crate对象,它有一个KeyValuePairs列表。目前,我正在遍历每一对,以查看列表中所有项目的kvp.Value.PixelsWide是否相同。如果是,则返回true,否则返回false。
我现有的方法如下所示:
public bool Validate(Crate crate)
{
int firstSectionWidth = 0;
foreach (KeyValuePair<string, SectionConfiguration> kvp in crate.Sections)
{
if (firstSectionWidth == 0)//first time in loop
{
firstSectionWidth = kvp.Value.PixelsWide;
}
else //not the first time in loop
{
if (kvp.Value.PixelsWide != firstSectionWidth)
{
return false;
}
}
}
return true;
}
我很好奇是否可以在LINQ查询中执行?
提前感谢您的帮助!
答案 0 :(得分:60)
我相信这会奏效:
public bool Validate(Crate crate)
{
return crate.Sections
.Select(x => x.Value.PixelsWide)
.Distinct()
.Count() < 2;
}
如果crate.Sections
为空以及元素全部相同(这是当前函数的行为),则返回true。
答案 1 :(得分:15)
试试这个
var pixelsWide = rate.Sections.Values.First().PixelsWide;
bool result = crate.Sections.Values.All(x => x.PixelsWide == pixelsWide);
答案 2 :(得分:7)
这是Stecya's答案的变体,不会为空集合抛出异常。
var first = crate.Sections.Values.FirstOrDefault();
bool result = crate.Sections.Values.All(x => x.PixelsWide == first.PixelsWide);
答案 3 :(得分:4)
如果您不介意遍历整个集合:
bool hasOneValue = crate.Sections.Select(s => s.Value.PixelsWide).Distinct().Count() == 1;
或者使其与您的代码保持一致:
bool validateResult = crate.Sections.Select(s => s.Value.PixelsWide).Distinct().Count() <= 1;
答案 4 :(得分:2)
分组太慢了吗?
public bool Validate(Crate crate)
{
return crate.GroupBy(c => c.Value.PixelsWide).Count() < 2;
}
答案 5 :(得分:1)
我和@Stecya在一起:
public class Crate
{
IList<KeyValuePair<string,SectionConfiguration>> Sections ;
public bool IsValid()
{
return Sections.All( x => x.Value.PixelsWide == Sections.FirstOrDefault().Value.PixelsWide ) ;
}
public class SectionConfiguration
{
public int PixelsWide ;
}
}
答案 6 :(得分:0)
我的版本:
public bool Validate(Crate crate)
{
return !crate.Sections
.Any(a => crate.Sections
.Where(b => b.Value.PixelsWide != a.Value.PixelsWide).Any()
);
}
答案 7 :(得分:0)
可以相当简单地将其实现为扩展方法:
public static bool AllEqual<T1, T2>(this IEnumerable<T1> enumerable, Func<T1, T2> selector)
{
using (var enumerator = enumerable.GetEnumerator())
{
if (!enumerator.MoveNext())
return false;
var first = selector(enumerator.Current);
while (enumerator.MoveNext())
{
var current = selector(enumerator.Current);
if (current == null)
{
if (first == null)
continue;
return false;
}
if (current.Equals(first) == false)
return false;
}
return true;
}
}
答案 8 :(得分:0)
我的扩展方法如下:
myList.AllAre((x, first) => x.Value == first.Value);
它的用法如下:
kit