0

我想更新DataTable并合并用户名和服务器名称重复的行。

我想保持所有行相同,只需合并LearningGroups列。

请参阅附图以更好地理解: 在此处输入图像描述

正如您所看到的,前两行是相同的,所以我希望他们在添加学习组的情况下将其设为 1。

我在这里看到了很多示例,但我无法将其更改为我的需要,因为我需要使用两列进行过滤 ServeName,Username 并连接字符串列 LearningGroup。

任何帮助高度赞赏。

更新

在这里找到一个可能的解决方案:

  var result = report.AsEnumerable()
        .GroupBy(r => new
        {
            Version = r.Field<String>("f_username"),
            Col1 = r.Field<String>("servername"),

        })
        .Select(g =>
        {
            var row = g.First();
         //   row.SetField("LearningGroupName", g.Concat(r => r.Field<string>("LearningGroupName"))); 
            return row;
        }).CopyToDataTable();

但它返回新的第一个 LearningGroupName 行是空的,因为我已经评论了这一行,它给出的错误是添加列值所以不知道如何将它更改为连接?

4

3 回答 3

0

您需要通过循环遍历 DataTable 的每个 DataRow 并检查前一行并决定是否将该行添加到新的 dataTable 或合并来手动执行此操作。

DataTable _newTable = new DataTable();

foreach(DataRow _row in _dataTable) {

}

或更改基础数据以解决问题或使用 SQL 执行此操作。我会在 C# 中执行此操作或修复数据。

于 2013-07-07T15:16:18.230 回答
0

试试这个:

简单类:

class Foo
{
    public string ServerName { get; set; }
    public string UserName { get; set; }
    public string LearningGroup { get; set; }
}

样本数据的初始化:

List<Foo> _source = new List<Foo> 
        {
            new Foo { ServerName ="ServA", UserName = "John", LearningGroup ="First Group" },
            new Foo { ServerName ="ServA", UserName = "Kate", LearningGroup ="First Group" },
            new Foo { ServerName ="ServA", UserName = "John" },
            new Foo { ServerName ="ServB", UserName = "Kate", },
            new Foo { ServerName ="ServB", UserName = "Kate", LearningGroup ="Second Group" }
        };

查询解决问题:

var tmp = (from x in _source
          join f in _source on new { UserName = x.UserName, ServerName = x.ServerName } equals new { UserName = f.UserName, ServerName = f.ServerName }
          where !string.IsNullOrEmpty(x.LearningGroup)                      
          select x).Distinct();

数据表解决方案:

DataTable dt = new DataTable();
dt.Columns.Add("ServerName", typeof(string));
dt.Columns.Add("UserName", typeof(string));
dt.Columns.Add("LearningGroup", typeof(string));

dt.Rows.Add("ServA", "John", "First Group");
dt.Rows.Add("ServA", "Kate", "First Group");
dt.Rows.Add("ServA", "John", null);
dt.Rows.Add("ServB", "Kate", null);
dt.Rows.Add("ServB", "Kate", "Second Group");

var tmpDT = (from x in dt.AsEnumerable()
             join f in dt.AsEnumerable() on new { UserName = x.Field<String>("UserName"), ServerName = x.Field<String>("ServerName") } equals new { UserName = f.Field<String>("UserName"), ServerName = f.Field<String>("ServerName") }
             where !string.IsNullOrEmpty(x.Field<String>("LearningGroup"))
             select x).Distinct();

这个查询的结果类型是IEnumerable<DataRow>这样的,你可以使用 foreach 循环来创建新DataTable的具有适当数据的:

DataTable newDT = new DataTable();
newDT.Columns.Add("ServerName", typeof(string));
newDT.Columns.Add("UserName", typeof(string));
newDT.Columns.Add("LearningGroup", typeof(string));

foreach (var item in tmpDT)
{
    newDT.ImportRow(item);
}
于 2013-07-07T15:16:33.873 回答
0

我不是 100% 确定你到底需要什么输出,但大概你想对重复的学生进行分组并将他们的课程和导师连接起来

一个完整的工作示例:

class Program
{
    static void Main(string[] args)
    {
        // setup dummy DataTable
        var tbl = new DataTable();

        tbl.Columns.Add("id", typeof(Int32));
        tbl.Columns.Add("learningGroup", typeof(String));
        tbl.Columns.Add("tutor", typeof(String));

        tbl.Rows.Add(1, "", "");
        tbl.Rows.Add(1, "group 1", "sam");
        tbl.Rows.Add(2, "group 1", "john");
        tbl.Rows.Add(3, "group 2", "paul");

        tbl = Group(tbl);

        // print DataTable
        foreach (DataRow row in tbl.Rows)
        {
            foreach (var item in row.ItemArray)
            {
                Console.Write(item+"|");
            }
            Console.WriteLine();
        }

        Console.Read();
    }

    // Group-Concat learningGroup and 
    // tutor copying to new DataTable
    static DataTable Group(DataTable tbl)
    {
        var groups = tbl.AsEnumerable()
                        .GroupBy(r => r.Field<Int32>("id"))
                        .Select(g => new {
                                            id = g.Key,
                                            learningGroup = string.Join(",", g.Select(s => s["learningGroup"])).TrimStart(','),
                                            tutor = string.Join(",", g.Select(s => s["tutor"])).TrimStart(','),
                                         });

        var newtbl = new DataTable();

        newtbl.Columns.Add("id", typeof(Int32));
        newtbl.Columns.Add("learningGroup", typeof(String));
        newtbl.Columns.Add("tutor", typeof(String));

        foreach (var g in groups)
        {
            newtbl.Rows.Add(g.id, g.learningGroup, g.tutor);
        }

        return newtbl;
    }
}
于 2013-07-07T15:53:47.820 回答