使用LINQ,我可以验证属性是否具有所有对象的相同值?

时间:2011-03-29 20:42:59

标签: c# 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查询中执行?

提前感谢您的帮助!

9 个答案:

答案 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