Подтвердить что ты не робот

Используя 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?

Заранее благодарим за помощь!

4b9b3361

Ответ 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;
}