使用内部聚合对象分组并映射到对象

时间:2013-11-16 06:43:34

标签: c# linq

我有很多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()
                    });

1 个答案:

答案 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一起使用。他们的GetHashCodeEquals重载对每个成员都有效。