我有很多Object1A
,说IEnumerable<Object1A>
。
public class Object1A {
public string text;
public datetime date;
public decimal percent;
public Object3 obj;
}
其中许多对象具有相同的文本,日期和百分比,但具有不同的对象。我想转换列表,使输出为IEnumerable<Object1B>
其中
public class Object1B{
public string text;
public datetime date;
public decimal percent;
public IEnumerable<Object3> objs;
}
我当前的apporach有点笨重,并在下面列出
IEnumerable<Object1A> a = GetSomeConstruct();
var lookup = a.ToLookup( t => t.text);
var b = new List<Object1b>();
foreach(var group in lookup){
var itemA = group.first();
var itemB = new Object1b(){
text = itemA.text,
date = itemA.date,
percent = itemA.percent
};
itemB.objs = pair.Select(t => t.obj);
b.Add(itemB);
}
这种方法可以改进吗?它似乎没有变慢,但似乎它可能会更好。如果可能的话,我正在寻找一种更简洁的方法。
编辑:是的,这是一个愚蠢的问题,对downvote的赞誉......
简单回答
var b_objects = a_objects.GroupBy(t => new {t.Text})
.Select( t => new Object1B
{ Text = t.Key.Text,
Percent = t.First().Percent,
Date = t.First().Date,
Objs = t.Select( o => o.Obj).ToList()
});
答案 0 :(得分:1)
var b = from a in GetSomeConstruct()
group a.obj by new { a.text, a.date, a.percent } into grp
select new Object1B
{
text = grp.Key.text,
date = grp.Key.date,
percent = grp.Key.percent,
objs = grp
};
您可以将匿名类型与join和group by一起使用。他们的GetHashCode
和Equals
重载对每个成员都有效。