【问题标题】:Grouping with linq; But with conditions用 linq 分组;但有条件
【发布时间】:2011-10-12 16:34:11
【问题描述】:

我不知道如何对这些类的列表进行分组。

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
}

我理解的基本分组。它看起来像这样(假设 orders 是 List<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 吗?还是我只需要迭代所有行并手动分离符合我条件的行。

【问题讨论】:

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


    【解决方案1】:

    使用匿名类型,例如:

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

    【讨论】:

    • 但我需要确保只在 OrderTypeId == 123 时为 OrderTypeId 和 OrderSubTypeId 执行逻辑
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这比其他的更接近。但它不区分具有相同和不同 OrderSubTypeId 值的行。 (请记住,我不需要将订单与 OrderTypeId = 123 且 OrderSubTypeId 的其他订单组合在一起。)您的示例将分隔所有 OrderTypeId = 123 的项目。
      • 这真的很难得到(正如你已经说过的)。您想要分隔“具有相同 OrderClassId 且 OrderTypeId 为 123 且具有相同 OrderSubTypeId 的订单”。这听起来像:把它们分开,句号。但是“并且拥有 OrderSubTypeId”是什么意思?
      【解决方案4】:

      正如基里尔所说,只需使用 var orderGroups = orders.GroupBy(x => new { x.OrderClassId, x.OrderSubTypeId });

      【讨论】:

      • 但我需要确保只在 OrderTypeId == 123 时为 OrderTypeId 和 OrderSubTypeId 执行逻辑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2021-09-02
      相关资源
      最近更新 更多