Используя LINQ, могу ли я проверить, что свойство имеет одинаковое значение для всех объектов?
У меня есть объект 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?
Заранее благодарим за помощь!
Ответы
Ответ 1
Я считаю, что это сработает:
public bool Validate(Crate crate)
{
return crate.Sections
.Select(x => x.Value.PixelsWide)
.Distinct()
.Count() < 2;
}
Это вернет true, если crate.Sections
пуст, а также когда все элементы одинаковы (это поведение вашей текущей функции).
Ответ 2
Попробуйте это
var pixelsWide = rate.Sections.Values.First().PixelsWide;
bool result = crate.Sections.Values.All(x => x.PixelsWide == pixelsWide);
Ответ 3
Вот вариант ответа Stecya, который не генерирует исключение для пустой коллекции.
var first = crate.Sections.Values.FirstOrDefault();
bool result = crate.Sections.Values.All(x => x.PixelsWide == first.PixelsWide);
Ответ 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;
Ответ 5
Я с @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
Моя версия:
public bool Validate(Crate crate)
{
return !crate.Sections
.Any(a => crate.Sections
.Where(b => b.Value.PixelsWide != a.Value.PixelsWide).Any()
);
}
Ответ 7
Слишком медленная группировка?
public bool Validate(Crate crate)
{
return crate.GroupBy(c => c.Value.PixelsWide).Count() < 2;
}