如何加入不同的属性对象集合
Posted
技术标签:
【中文标题】如何加入不同的属性对象集合【英文标题】: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左连接 【参考方案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);
当日期缺失时,结果将有null
s,即
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 != null
和sub?.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
【讨论】:
以上是关于如何加入不同的属性对象集合的主要内容,如果未能解决你的问题,请参考以下文章
在 AngularFirestore 中使用来自两个不同集合的数据构建对象时遇到问题
如何将不同类型的子元素反序列化为基类型的列表/集合,这是相应类的属性
如何在JAVA中用JACKSON映射一个JSON中的数组,这个数组可以包含不同类型的对象作为项目?