【问题标题】:DataTable group the resultDataTable 对结果进行分组
【发布时间】:2012-10-06 12:38:59
【问题描述】:

我想在数据表中按名称、姓氏分组,其余的应该在同一行。有人可以帮我吗?

我的数据表:

 Name   LastName    1    3    2
 kiki    ha         FF
 lola    mi             AA
 ka      xe                   UU
 kiki    ha                   SS

我想按名称分组数据表:

Name   LastName   1    3     2
kiki    ha        FF         SS 
lola    mi             AA 
ka      xe                   UU

我的新代码:

var result11 = from t1 in newtable.AsEnumerable()
               group t1 by new { Name = t1.Field<String>("Name"), LastName = t1.Field<String>("LastName") } into grp
               select new
               {
                   Name = grp.Key.Name,
                   LastName = grp.Key.LastName,

                   //Something must be there     
               };

【问题讨论】:

  • 如果有冲突怎么办?如果第 1 列的值在几行中具有相同的 Name 和 LastName?
  • 不,在我的表中,第 1,3 和 2 列将只有一个值,用于与此表相同的 Name 和 LastName,不会发生冲突。请把“我的数据表”作为固定表

标签: c# linq datatable linq-group


【解决方案1】:

如果您想要 DataTable 作为结果,这会给出您想要的结果:

var lastNameGroups = from row in table1.AsEnumerable()
                     group row by new {
                        Name= row.Field<String>("Name"), 
                        LastName = row.Field<String>("LastName")
                     } into LastNameGroups
                     select LastNameGroups;

var table2 = table1.Clone();
foreach (var lng in lastNameGroups)
{
    var row = table2.Rows.Add();
    row.SetField("Name", lng.Key.Name);
    row.SetField("LastName", lng.Key.LastName);
    var ones = lng.Where(r => !string.IsNullOrEmpty(r.Field<String>("1")));
    if(ones.Any())
        row.SetField("1", ones.First().Field<String>("1"));
    var twos = lng.Where(r => !string.IsNullOrEmpty(r.Field<String>("2")));
    if (twos.Any())
        row.SetField("2", twos.First().Field<String>("2"));
    var threes = lng.Where(r => !string.IsNullOrEmpty(r.Field<String>("3")));
    if (threes.Any())
        row.SetField("3", threes.First().Field<String>("3"));
}

【讨论】:

  • 感谢蒂姆。完美运行。但如果我不知道我有多少列?修复的是 Name, LastName 但 1,3,2,4,6,7... 它们是来自 ID Column 的值,我将它们设为 ColumnName,代码应该是什么?
  • 那么问题就变得不清楚了,什么样的DataTable有未知的列数?能举个例子吗?
  • @UniLe:请不要改变你的问题。现在所有答案都应该不被接受/否决,因为它们不再回答您当前的问题。而是问另一个问题。
  • 对不起蒂姆,我发了一个新帖子:stackoverflow.com/questions/12916110/…
【解决方案2】:

添加这些行而不是注释 (//something must be there):

C1 = String.Join(",", grp.Select(r=>r.Field<String>("1"))),
C2 = String.Join(",", grp.Select(r=>r.Field<String>("2"))),
C3 = String.Join(",", grp.Select(r=>r.Field<String>("3")))

在输出中获取三个新列,这些列聚合来自列 132 的值。

如果您在一个组的一列中有多个值,所有值都将显示并用逗号分隔 (,)。

如果您确定每组每列最多有一个值,那么您可以简单地这样做:

C1 = grp.Max(r => r.Field<String>("1")),
C3 = grp.Max(r => r.Field<String>("3")),
C2 = grp.Max(r => r.Field<String>("2"))

【讨论】:

  • 还有一个问题:同样的例子,但如果我不知道我有多少列?像 1,3,2,4,8 ... 我该怎么做?
  • 在这种情况下,这种方法不起作用,因为您不知道输出(匿名)类型中需要多少列(属性)。尝试输出到另一个DataTable
  • @UniLe 或者,您可以输出 Dictionary&lt;string, string&gt;,而不是 N 列,您可以在其中使用列名作为键,将 grp.Max(r =&gt; r.Field&lt;String&gt;(colName)) 作为值
  • 嗯...这有点复杂,你能在我的新帖子中告诉我吗? stackoverflow.com/questions/12916110/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2023-03-23
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多