LINQ查询不返回我期望的结果

时间:2014-10-14 23:15:01

标签: c# linq

希望这只是一个简单的例子,我没有看到一些细节......

我正在玩LINQ示例。这是我创建的一个简单类:

    public class Art
    {
        public string Type { get; set; }
        public int Price { get; set; }
    }

这是我正在创建的示例编码:

    public static void Example0000()
    {
        List<Art> art = new List<Art>();
        art.Add(new Art() { Price = 45, Type = "painting" });
        art.Add(new Art() { Price = 123, Type = "sculpture" });
        art.Add(new Art() { Price = 2, Type = "icon" });
        art.Add(new Art() { Price = 460, Type = "sculpture" });
        art.Add(new Art() { Price = 2030, Type = "painting" });
        art.Add(new Art() { Price = 10, Type = "icon" });
        art.Add(new Art() { Price = 700, Type = "painting" });
        art.Add(new Art() { Price = 1400, Type = "sculpture" });
        art.Add(new Art() { Price = 46, Type = "painting" });
        art.Add(new Art() { Price = 12000, Type = "sculpture" });
        art.Add(new Art() { Price = 6, Type = "icon" });
        art.Add(new Art() { Price = 810, Type = "sculpture" });
        art.Add(new Art() { Price = 250, Type = "painting" });
        art.Add(new Art() { Price = 3, Type = "icon" });
        art.Add(new Art() { Price = 1000, Type = "painting" });
        art.Add(new Art() { Price = 260, Type = "sculpture" });

        var artprices =
            from a in art
            group a by a.Type into g
            let maxPrice = g.Max(a => a.Price)
            select new { ArtType = g.Key, MostExpensive = g.Where(a => a.Price == maxPrice) };

        dataGridView1.DataSource = artprices.ToArray();
    }

我正在寻找的是一个双列表,每种类型的艺术品都有最高的“付费”价格。所以表应该有:

“绘画”2030

“雕塑”12000

“icon”10

相反,我在第二栏中没有看到任何数字。我错过了什么?

2 个答案:

答案 0 :(得分:3)

我只是订购它,而不是找到最大值并检查该价格的艺术品。我对查询语法不是很了解,但这就是我要做的。

var artprices = art.GroupBy(c => c.Type)
                   .Select(c => new
                                {
                                    ArtType = c.Key,
                                    MostExpensive = c.OrderByDescending(x => x.Price).First()
                                });

分类总是很不幸,但这对你的情况来说可能是最好的。

所有人都说,我也不确定你为什么会在第二栏中期待数字。如果你只想要那种艺术类型的最高价格,而不是艺术本身,那就与你所拥有的不同。

var artprices = art.GroupBy(c => c.Type)
                   .Select(c => new
                                {
                                    ArtType = c.Key,
                                    MostExpensive = c.Max(x => x.Price)
                                });

我怀疑,如果我理解正确的话,那就是你的专栏正在寻找一个数字类型,而你正在给它一个Art,所以它没有打印出任何内容。我可能是错的,如果不了解您的设置,那就很难了。但那是我的猜测。如果是这种情况,我在后面的查询应该可以帮到你。

答案 1 :(得分:0)

表达式的枚举结果的匿名类型具有成员ArtType,具有类型字符串,并且(最重要的)MostExpensive,具有类型IEnumerable&lt; Art&gt;。换句话说,可能存在两个不同的问题:首先,如果您希望第二列是单个值,则需要返回单个值,而不是值的枚举。其次,您想要的值的类型是int,而不是Art。

我认为你想要的是这个表达式:

var artprices =
    from a in art
    group a by a.Type into g
    select new { ArtType = g.Key, MostExpensive = g.Max(a => a.Price) };