如何将数据表分组为单行数据

时间:2015-07-14 18:14:41

标签: c# datatable grouping

假设我有以下数据表:

EquipmentID    SerialNum  filename
-----------    ---------  --------
441573         05-335-03  2041165.JPG
441573         05-335-03  2041166.JPG
441573         05-335-03  2041167.JPG
441193         52005088   2536398.JPG

我希望以441573是具有文件名数组(或列表)的单个数据实例的方式对此数据进行分组。所以最后的数据应该是这样的:

{EquipmentID: 441573, SerialNum: 05-335-03, filename:{2041165.JPG, 2041166.JPG, 2041167.JPG}},

{EquipmentID: 441193, SerialNum: 52005088, filename:{2536398.JPG}}

我试过了:

var groupedEquipment = from e in equipment.AsEnumerable()
                group e by e.Field<int>("EquipmentID");

但是会为每个文件名带回一行。我希望文件名在EquipmentID数据中分组,如图所示。

有什么想法吗?问题可能是错误的问题,不知道我该怎么说。

2 个答案:

答案 0 :(得分:4)

一旦您GroupBy数据,您就可以使用常规的linq函数来选择您需要的任何内容。在您的情况下,一个很好的示例是使用string.Join来获取单个string,以便您可以将其写入控制台。

x.Select(y => y.FileName)行是魔法来自的地方。这是选择组中所有项并对其执行某些操作的行。

class EqupimentEntry
{
    public int EqupimentId { get; set; }
    public string SerialNumber { get; set; }
    public string FileName { get; set; }
}
List<EqupimentEntry> entries = new List<EqupimentEntry>()
{
    new EqupimentEntry { EqupimentId = 441573, SerialNumber = "05-335-03", FileName = "2041165.JPG" },
    new EqupimentEntry { EqupimentId = 441573, SerialNumber = "05-335-03", FileName = "2041166.JPG" },
    new EqupimentEntry { EqupimentId = 441573, SerialNumber = "05-335-03", FileName = "2041167.JPG" },
    new EqupimentEntry { EqupimentId = 441193, SerialNumber = "52005088", FileName = "2536398.JPG" },
};

var groupedEquipments = entries
    .GroupBy(x => x.EqupimentId) //group by the Id
    .Select(x => new //make an anonymous type to get data
    {
        EqupimentId = x.Key,
        //this line will take all FileNames in the group and put a ", " between them.
        //this returns a single string
        FileNameList = string.Join(", ", x.Select(y => y.FileName))
    });

//foreach group, write to console (for example)
foreach (var group in groupedEquipments)
{
    System.Console.WriteLine(group.EqupimentId + ":" + group.FileNameList);
}

这输出以下内容:

441573:2041165.JPG, 2041166.JPG, 2041167.JPG
441193:2536398.JPG

注意:此示例仅按EquipmentId分组。如果需要,您可以添加多个GroupBy元素,并且可以在以后的方法中从Key属性访问这些元素。

答案 1 :(得分:1)

只使用Linq,我会使用更简单。

  var groupedEquipment = s
     .GroupBy(i => new { i.EquipmentID, i.SerialNum })
     .Select(d => new
     {
         EquipmentID = d.Key.EquipmentID,
         SerialNum = d.Key.SerialNum,
         filename = s.Where(e => e.EquipmentID == d.Key.EquipmentID)
                     .Select(f => f.filename).ToList()                                                 
     }).ToList();

第一组按EquipmentID和SerialNum,然后返回新选择对象中的所有列以返回结果

{EquipmentID: 441573, SerialNum: 05-335-03, filename:{2041165.JPG, 2041166.JPG, 2041167.JPG}},
{EquipmentID: 441193, SerialNum: 52005088, filename:{2536398.JPG}}