0

おそらくかなり単純なことをするのに問題があります。

私の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つだけになるようにすることです。つまり、名前ごとに1つですが、「アクション: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

誰かが私にそれをどのように行うことができるか説明できますか?

乾杯

4

2 に答える 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" }
};

// 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

于 2012-05-02T19:31:03.380 に答える
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
    });

上記のクエリは、名前ごとに2つの行しかないことを前提としています。名前ごとに複数の行がある場合は、代わりにを使用して2番目のAction/Id値を取ることができます.Skip(1).Take(1).Last()

于 2012-05-03T09:54:47.070 に答える