LINQ查询没有返回我期望的结果
本文关键字:期望 结果 返回 查询 LINQ | 更新日期: 2023-09-27 18:26:35
希望这只是我没有看到一些小细节的一个简单案例。。。
我在玩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
"图标"10
相反,我在第二栏中没有看到任何数字。我错过了什么?
与其找到最大值并检查该价格的艺术品,我宁愿订购它。我不擅长查询语法,但这就是我要做的。
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
,所以它没有打印出任何内容。我可能错了,如果不了解更多关于你的设置,这很难。但这是我的猜测。如果是这样的话,我在这里的后一个查询应该会对你有所帮助。
表达式枚举结果的匿名类型的成员为ArtType,类型为string,(最重要的)MostExperience,类型为IEnumerable<艺术>。换句话说,可能存在两个不同的问题:首先,如果希望第二列为单个值,则需要返回单个值,而不是值的枚举。其次,您想要的值的类型是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) };