C#Datatable如何像行一样分组

时间:2014-10-21 06:11:38

标签: c# .net database

我仍然是C#的新手,我想知道是否有内置函数来执行以下操作:

- 我正在通过DataTable将数据库中的行加载到 DataGridView

- 我有很多行在一列中具有相同的值,但在antoher列中有不同的值,EG:

NAME, PRICE
chair, 7.00
chair, 6.00
chair, 8.00
table, 15.00
table, 17.00
plate, 4.00
plate, 4.50

有没有人知道如何遍历每一行,并为每个产品选择最便宜的价格并将其发送到另一个列表/对象?

我今天才开始使用DataTables和DataGridView元素,所以我有点不确定最好的方法。基本上我想要一个结束列表,其中包含每个产品中的一个,旁边找到最便宜的价格。 EG

NAME, PRICE
chair, 6.00
table, 15.00
plate, 4.00

我不确定在这种情况下使用对象,列表或词典是否是最好的,并且想知道是否有人可以提供更多的光。 :)

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

考虑到你datatable看起来像这样:

var dt=new DataTable();
dt.Columns.Add("NAME",typeof(string));
dt.Columns.Add("PRICE",typeof(float));

dt.Rows.Add("chair", 7.00);
dt.Rows.Add("chair", 6.00);
dt.Rows.Add("chair", 8.00);
dt.Rows.Add("table", 15.00);
dt.Rows.Add("table", 17.00);
dt.Rows.Add("plate", 4.00);
dt.Rows.Add("plate", 4.50);

你有一个想要以这样的方式呈现信息的对象:

public class Foo
{
    public string Name {get;set;}
    public float Price {get;set;}
}

您可以执行这样的linq查询以获取最低价格和名称:

var result= (
    from row in dt.AsEnumerable()
    group row by row.Field<string>("NAME") into g
    select new Foo
    {
        Name = g.Key,
        Price=g.Min (x =>x.Field<float>("PRICE"))
    }
).ToList();

这将得到以下结果:

chair 6 
table 15 
plate 4 

参考: