【问题标题】:How can I join different property object collections如何加入不同的属性对象集合
【发布时间】:2018-04-16 15:38:09
【问题描述】:

我有我的问题类别的列表

var firstList = new List<object> {
    new { id =1, Name = "item-1"},
    new { id =2, Name = "item-2"},
    new { id =3, Name = "item-3"},
    new { id =4, Name = "item-4"}
}

我的第二个列表是这样的

var secondList = new List<Issue> {
    new Issue{ id =1, Date = "01.01.2017"},
    new Issue{ id =2, Date = "01.02.2017"}
}

所以我想创建一个这样的新列表。 (相同的 id 对象将是 isPlanned=true)

var firstList = new List<object> {
    new { id =1, Name = "item-1", isPlanned=true, Date = "01.01.2017"},
    new { id =2, Name = "item-2", isPlanned=true, Date = "01.02.2017"},
    new { id =3, Name = "item-3", isPlanned=false },
    new { id =4, Name = "item-4", isPlanned=false }
}

我怎样才能做这个 linq 函数或 lambda 操作?

【问题讨论】:

  • 根据id左连接

标签: c# entity-framework linq


【解决方案1】:

您可以为此使用左连接:

var items = new[] {
    new { id =1, Name = "item-1"},
    new { id =2, Name = "item-2"},
    new { id =3, Name = "item-3"},
    new { id =4, Name = "item-4"}
};
var issues = new[] {
    new { id =1, Date = "01.01.2017"},
    new { id =2, Date = "01.02.2017"}
};
var joined = from item in items
             join issue in issues on item.id equals issue.id into gj
             from sub in gj.DefaultIfEmpty()
             select new { item.id, item.Name, isPlanned=sub?.Date != null, sub?.Date };
foreach (var t in joined) {
    Console.WriteLine("{0} {1} {2} {3}", t.id, t.Name, t.isPlanned, t.Date);
}

当日期缺失时,结果将有nulls,即

new { id =1, Name = "item-1", isPlanned=true,  Date = "01.01.2017"},
new { id =2, Name = "item-2", isPlanned=true,  Date = "01.02.2017"},
new { id =3, Name = "item-3", isPlanned=false, Date = null },
new { id =4, Name = "item-4", isPlanned=false, Date = null }

Demo.

【讨论】:

  • 对象引用未设置为对象的实例 我的 lis 发生错误。我想from sub in gj.DefaultIfEmpty()
  • @bookmarker 您确定您的select new ... 没有缺少isPlanned=sub?.Date != nullsub?.Date 中的问号吗?我在 ideone 上遇到了同样的错误(参见演示),因为我忘记了问号。
  • c# 6.0 属性不受支持
  • @bookmarker 然后你需要为这些属性写一个旧式的表达式,例如Date=sub!=null ? sub.Date : null
【解决方案2】:

如果你想使用 lambda 表达式,你可以这样做:

List<Foo> foos = new List<Foo>()
{
    new Foo(){ Id = 1, Name = "item-1"},
    new Foo(){ Id = 2, Name = "item-2"},
    new Foo(){ Id = 3, Name = "item-3"},
    new Foo(){ Id = 4, Name = "item-4"}
};

List<Bar> bars = new List<Bar>()
{
    new Bar(){ Id = 1, Date = "01.01.2017"},
    new Bar(){ Id = 2, Date = "01.02.2017"}
};

IEnumerable<dynamic> result = foos.GroupJoin(bars,
    f => f.Id,
    b => b.Id,
    (foo, bar) => new
    {
        Id = foo.Id,
        Name = foo.Name,
        isPlanned = String.IsNullOrEmpty(bar.SingleOrDefault()?.Date),
        Date = bar.SingleOrDefault()?.Date
    });

这里是类

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Bar
{
    public int Id { get; set; }
    public string Date { get; set; }
}

我还从另一个答案的 cmets 中注意到您无法使用 C#6.0,因此本节不适用于您

isPlanned = String.IsNullOrEmpty(bar.SingleOrDefault()?.Date),
Date = bar.SingleOrDefault()?.Date

您可以将其替换为以下内容:

isPlanned = bar.SingleOrDefault() == null ? false : String.IsNullOrEmpty(bar.SingleOrDefault().Date),
Date = bar.SingleOrDefault() == null ? null : bar.SingleOrDefault().Date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2016-11-28
    • 2021-06-17
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多