gpt4 book ai didi

c# - 使用 C# Linq 连接行

转载 作者:太空宇宙 更新时间:2023-11-03 20:05:19 25 4
gpt4 key购买 nike

如果有一个名为STUDENTS的DataTable

SubjectID       StudentName
---------- -------------
1 Mary
1 John
1 Sam
2 Alaina
2 Edward

我们如何使用 Linq 得到下面的数据表:

SubjectID       StudentName
---------- -------------
1 Mary, John, Sam
2 Alaina, Edward

我尝试使用 foreach 循环逐一爬过每个数据行来实现此结果,但遇到了重大性能问题。

Linq 不太好,但我尝试了它。一旦我得到具体的答案,我会发布我的答案,但我将不胜感激。

不使用 Linq 但未提供所需性能的示例工作代码。如果 DataTable dt2 有大约 3500 条记录,下面的 foreach 循环大约需要 15 分钟。

        DataTable dtFiles = dt2.Clone();

//Logic to filter out the files by keyword name filter.
foreach (DataRow row in dt2.Rows)
{
string studentid = row.Field<string>("StudentID");
string filter = "StudentID = '" + studentid + "'";
if(dtFiles.Select(filter).Count() == 0)//this means keyword is new
{
DataRow dr = dtFiles.NewRow();
dr["StudentName"] = row["StudentName"];
dr["StudentID"] = row["StudentID"];
dtFiles.Rows.Add(dr);
}
else
{
dtFiles.Select(filter).First<DataRow>()["StudentName"] += "," + row.Field<string>("StudentName");//Rows[0]
}
}

最佳答案

获取分组数据

var subjects = 
from r in dtFiles.AsEnumerable()
group r by r.Field<int>("SubjectID") into g
select new {
ID = g.Key,
Students = String.Join(", ", g.Select(r => r.Field<string>("StudentName"))
};

然后构建DataTable(如果你需要的话)

DataTable dt = new DataTable();
dt.Columns.Add("SubjectID", typeof(int));
dt.Columns.Add("StudentName", typeof(string));
// or you can just clone existing DataTable:
DataTable dt = dtFiles.Clone();

foreach(var subject in subjects)
dt.Add(subject.ID, subject.Students);

关于c# - 使用 C# Linq 连接行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23947798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com