与linq分组;但有条件

时间:2011-10-12 16:34:12

标签: c# .net linq c#-4.0

我无法理解如何对这些类的列表进行分组。

public class Order
{
    public int OrderId { get; set; }
    public long OrderClassId { get; set; }
    public int OrderTypeId { get; set; }
    public int OrderSubTypeId { get; set; }
    public string OrderString { get; set; }
    //.. other Order stuff not relevant to question
}

我理解的基本分组。看起来像这样(假设ordersList<Order>):

var orderGroups = orders.GroupBy(x=>x.OrderClassId);

// Code to assign a unique OrderString to each group goes here

但是,具有相同OrderClassId并且OrderTypeId为123且具有相同OrderSubTypeId的订单需要具有不同的OrderString值。

这有点令人困惑,所以这是一个例子:

var order1 = new Order
                    {
                        OrderId = 1,
                        OrderClassId = 8754,
                        OrderTypeId = 123,
                        OrderSubTypeId = 7156
                    };

var order2 = new Order
                    {
                        OrderId = 2,
                        OrderClassId = 8754,
                        OrderTypeId = 123,
                        OrderSubTypeId = 7156
                    };

var order3 = new Order
                    {
                        OrderId = 3,
                        OrderClassId = 8754,
                        OrderTypeId = 951,
                        OrderSubTypeId = 35144
                    };

通过我的分组,所有这些都会得到相同的OrderString。但我需要order2才能获得不同的OrderString

使用linq可以吗?或者我只是要迭代所有行并手动分离符合我标准的行。

4 个答案:

答案 0 :(得分:2)

使用匿名类型,例如:

var orderGroups = orders.GroupBy(x => new {Property1, Property2});

答案 1 :(得分:2)

您可以在生成密钥时执行条件。

var groups = orders.GroupBy(x => new
{
  x.OrderClassId,
  TypeChoice = (x.OrderTypeId == 123) // ? true : false
}

答案 2 :(得分:2)

我认为这是你可以使用的(OrderId是唯一的,对吗?):

orders.GroupBy(o => 
  new {
    o.OrderClassId,
    OrderIdSel = o.OrderTypeId == 123 ? o.OrderId : -1
  } )

答案 3 :(得分:1)

正如基里尔所说的那样 var orderGroups = orders.GroupBy(x => new { x.OrderClassId, x.OrderSubTypeId });