2012-05-02 41 views
0

我有一个问题,可能很简单。LINQ分组或拆分

我的LINQ查询返回10个对象的结果集。

喜欢的东西:

Name: Bill, Action: aaa, Id: 832758 
Name: Tony, Action: aaa, Id: 82fd58 
Name: Bill, Action: bbb, Id: 532758 
Name: Tony, Action: bbb, Id: 42fd58 

我需要做的,就是一群这些让只有2行,即每名一个,但与一“行动:BBB”移入不同的列。所以输出将是:

Name: Bill, Action: aaa, Action_2: bbb, Id: 832758, Id_2: 532758 
Name: Tony, Action: aaa, Action_2: bbb, Id: 82fd58, Id_2: 42fd58 

任何人都可以向我解释我可能会这样做吗?

干杯

+0

你可以发布你的LINQ查询返回原始数据吗? – Habib

+0

每个名称只有2行还是数字未知? –

回答

1
var myData = new [] 
{ 
    new { Name = "Bill", Action="aaa", Id = "832758" }, 
    new { Name = "Tony", Action="aaa", Id = "82fd58" }, 
    new { Name = "Bill", Action="bbb", Id = "532758" }, 
    new { Name = "Tony", Action="bbb", Id = "42fd58" } 
}; 

var result = myData 
    .GroupBy(x=>x.Name) 
    .Select(g=>new 
    { 
     Name = g.Key, 
     Action = g.First().Action, 
     Action_2 = g.Last().Action, 
     Id = g.First().Id, 
     Id_2 = g.Last().Id 
    }); 

上面的查询假设你只有两行每名;如果你有每名多行,您可以通过使用.Skip(1).Take(1),而不是.Last()

1

我不认为有一个真正简单的方法来做到这一点。我connocted这一点,虽然,这可能让你开始:

var myData = new [] 
{ 
    new { Name = "Bill", Action="aaa", Id = "832758" }, 
    new { Name = "Tony", Action="aaa", Id = "82fd58" }, 
    new { Name = "Bill", Action="bbb", Id = "532758" }, 
    new { Name = "Tony", Action="bbb", Id = "42fd58" } 
}; 

// group all the Names together 
var result = from m in myData 
group m by m.Name into names 
orderby names.Key 
select names; 

// go through each Name group and create the output string to store in sbLines 
var sbLines = new StringBuilder(); 
foreach (var name in result) 
{ 
    var sb = new StringBuilder(); 
    sb.AppendFormat("Name: {0}, ", name.Key); 

    int count = 1; 
    foreach (var item in name) 
    { 
     if(count > 1) 
      sb.AppendFormat("Action_{0}: {1}, ", count, item.Action); 
     else 
      sb.AppendFormat("Action: {0}, ", item.Action); 
     count++; 
    } 

    count = 1; 
    foreach (var item in name) 
    { 
     if(count > 1) 
      sb.AppendFormat("Id_{0}: {1}, ", count, item.Id); 
     else 
      sb.AppendFormat("Id: {0}, ", item.Id); 
     count++; 
    } 

    sbLines.Append(sb.ToString().Trim(new char[] { ' ',',' })); 
    sbLines.Append(Environment.NewLine); 
} 

Console.WriteLine(sbLines.ToString()); 

运行在这里:http://ideone.com/8UTxr

0

感谢您的反馈家伙第二Action/Id值。他们都很有帮助。最终,我能够更轻松地使用RePierre的解决方案。

我还发现通过将相同的数据集连接到自身并进行过滤来实现这一点。