Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ分组或拆分_Linq_C# 4.0_Entity Framework 4 - Fatal编程技术网

LINQ分组或拆分

LINQ分组或拆分,linq,c#-4.0,entity-framework-4,Linq,C# 4.0,Entity Framework 4,我在做一些可能很简单的事情时遇到了问题 我的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 我需要做的是,对这些行进行分组,以便只有两行,即每个名称一行,但将带有“Action:bbb”的行移到另一列中。

我在做一些可能很简单的事情时遇到了问题

我的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
我需要做的是,对这些行进行分组,以便只有两行,即每个名称一行,但将带有“Action: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
谁能向我解释一下我该怎么做


干杯

我认为没有真正简单的方法。不过,我知道了这一点,这可能会让你开始:

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());
在此处运行它:


上面的查询假设每个名称只有两行;如果每个名称有多行,您可以使用
.Skip(1)执行第二个
操作
/
Id
值。使用(1)
而不是
.Last()

可以发布返回原始数据的LINQ查询吗?每个名称只有2行,还是数字未知?
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
    });