如何将数据表分组为单行数据
How to group a datatable into a single line of data
假设我有以下数据表:
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 数据中分组,如图所示。
有什么想法吗?应该是问错了,不知道怎么表达。
一旦你 GroupBy
你的数据,你可以使用常规的 linq 函数 select 任何你需要的。在您的情况下,一个很好的例子是使用 string.Join
返回单个 string
,以便您可以将其写入控制台。
x.Select(y => y.FileName)
行是魔术的来源。这是 select 组 中的所有项目 并对它们执行一些操作的行。
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
属性 访问这些元素。
我会更简单地使用 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 分组,然后 return 新选择对象中的所有列 return 结果
{EquipmentID: 441573, SerialNum: 05-335-03, filename:{2041165.JPG, 2041166.JPG, 2041167.JPG}},
{EquipmentID: 441193, SerialNum: 52005088, filename:{2536398.JPG}}
假设我有以下数据表:
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 数据中分组,如图所示。
有什么想法吗?应该是问错了,不知道怎么表达。
一旦你 GroupBy
你的数据,你可以使用常规的 linq 函数 select 任何你需要的。在您的情况下,一个很好的例子是使用 string.Join
返回单个 string
,以便您可以将其写入控制台。
x.Select(y => y.FileName)
行是魔术的来源。这是 select 组 中的所有项目 并对它们执行一些操作的行。
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
属性 访问这些元素。
我会更简单地使用 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 分组,然后 return 新选择对象中的所有列 return 结果
{EquipmentID: 441573, SerialNum: 05-335-03, filename:{2041165.JPG, 2041166.JPG, 2041167.JPG}},
{EquipmentID: 441193, SerialNum: 52005088, filename:{2536398.JPG}}