如何使用C#Lambda合并单个列表

时间:2019-02-27 11:26:20

标签: c# linq

我有一个类似于以下的课程:

public class MyData
{
    public int Key { get; set; }
    public string MyString { get; set; }
    public bool MyFlag { get; set; }
}

我有这些课程的清单:

var data = new List<MyData>();

填充如下:

data.Add(new MyData() { Key = 1, MyFlag = true, MyString = "Hello" });
data.Add(new MyData() { Key = 1, MyFlag = false, MyString = "Goodbye" });
data.Add(new MyData() { Key = 2, MyFlag = true, MyString = "Test" });
data.Add(new MyData() { Key = 2, MyFlag = false, MyString = "Merge" });
data.Add(new MyData() { Key = 3, MyFlag = false, MyString = "Data" });

我想要的是以下列表:

Key       true       false
1         Hello      Goodbye
2         Test       Merge
3                    Data

我需要一个匿名类型来反映上面的三个值。我发现了一些似乎暗示GroupJoin的帖子和文章,但是我不确定在这种情况下如何使用它,因为它似乎允许加入两个单独的列表。

2 个答案:

答案 0 :(得分:8)

我建议分组(通过let endTrim = ((str) => { let i = str.length - 1 while(str[i] === ' ') { str = str.slice(0,i) i-- } return str }) 属性)。如果要使用Keytrue属性,则必须将其分别设置为false@true,因为@falsetrue是关键字:

false

答案 1 :(得分:0)

请注意,我现在不在PC前面(因此我无法对其进行测试),但这至少应该给您一个想法。

data
.GroupBy(x => x.Key)
.Select(
    x => new { 
        Key = x.Key, 
        True = data.SingleOrDefault(y1 => y1.Key == x.Key && y1.MyFlag)?.MyString, 
        False = data.SingleOrDefault(y2 => y2.Key == x.Key && !y2.MyFlag)?.MyString
    });