C# 如何整合多个IEnumerable的结果<;T>;使用LINQ

C# 如何整合多个IEnumerable的结果<;T>;使用LINQ,c#,linq,ienumerable,C#,Linq,Ienumerable,我可以有多个(最多5个)IEnumerable,并希望按供应商代码将它们合并为单个IEnumerable分组。我的对象如下所示: ---------------------------------------- IEnumerable<ResortSupplier> - 1 Hyatt Resort Standard Room PricingDetail-1 Superior Room PricingDetail-1 Sandals Re

我可以有多个(最多5个)
IEnumerable
,并希望按供应商代码将它们合并为单个
IEnumerable
分组。我的对象如下所示:

----------------------------------------
IEnumerable<ResortSupplier> - 1

Hyatt Resort
  Standard Room
    PricingDetail-1
  Superior Room         
    PricingDetail-1

Sandals Resort
  Standard Room
    PricingDetail-1
  Delux Room            
    PricingDetail-1

----------------------------------------
IEnumerable<ResortSupplier> - 2

Hyatt Resort
  Standard Room
    PricingDetail-2
  Superior Room         
    PricingDetail-2
  One Bed Room Suit
    PricingDetail-2

Sandals Resort
  Standard Room
    PricingDetail-2
  Honeymoon Suit            
    PricingDetail-2
----------------------------------------
IEnumerable<ResortSupplier> - 3
.....
----------------------------------------
IEnumerable<ResortSupplier> - 4
.....
----------------------------------------
IEnumerable<ResortSupplier> - 5
.....
----------------------------------------
以下是我的物品:

[Serializable]
public class ResortSupplier
{
    public string SupplierCode { get; set; }
    public IList<Product> ResortProducts { get; set; }
}

[Serializable]
public class Product
{
    public string Code { get; set; }
    //Other fields... 
    public IList<PerPricing> PricingDetail { get; set; }
}

[Serializable]
public class PerPricing
{
    //Other fields..
    public decimal? Price { get; set; }
    public Error PricingError { get; set; }
}
[可序列化]
公共类度假酒店
{
公共字符串供应商代码{get;set;}
公共IList产品{get;set;}
}
[可序列化]
公共类产品
{
公共字符串代码{get;set;}
//其他领域。。。
公共IList PricingDetail{get;set;}
}
[可序列化]
公共类定价
{
//其他领域。。
公共十进制?价格{get;set;}
公共错误PricingError{get;set;}
}
多个IEnumerable中的数据可能如下所示:

----------------------------------------
IEnumerable<ResortSupplier> - 1

Hyatt Resort
  Standard Room
    PricingDetail-1
  Superior Room         
    PricingDetail-1

Sandals Resort
  Standard Room
    PricingDetail-1
  Delux Room            
    PricingDetail-1

----------------------------------------
IEnumerable<ResortSupplier> - 2

Hyatt Resort
  Standard Room
    PricingDetail-2
  Superior Room         
    PricingDetail-2
  One Bed Room Suit
    PricingDetail-2

Sandals Resort
  Standard Room
    PricingDetail-2
  Honeymoon Suit            
    PricingDetail-2
----------------------------------------
IEnumerable<ResortSupplier> - 3
.....
----------------------------------------
IEnumerable<ResortSupplier> - 4
.....
----------------------------------------
IEnumerable<ResortSupplier> - 5
.....
----------------------------------------
----------------------------------------
IEnumerable-1
凯悦度假村
标准间
PricingDetail-1
高级客房
PricingDetail-1
凉鞋度假村
标准间
PricingDetail-1
消光室
PricingDetail-1
----------------------------------------
IEnumerable-2
凯悦度假村
标准间
PricingDetail-2
高级客房
PricingDetail-2
单人房套装
PricingDetail-2
凉鞋度假村
标准间
PricingDetail-2
蜜月套装
PricingDetail-2
----------------------------------------
IEnumerable-3
.....
----------------------------------------
IEnumerable-4
.....
----------------------------------------
IEnumerable-5
.....
----------------------------------------
我的综合结果应包括:

IEnumerable<ResortSupplier> - Consolidated

Hyatt Resort
  Standard Room
    PricingDetail-1
    PricingDetail-2
  Superior Room         
    PricingDetail-1
    PricingDetail-2
  Bed Room Suit
    PricingDetail-2

Sandals Resort
  Standard Room
    PricingDetail-1
    PricingDetail-2
  Delux Room            
    PricingDetail-1
  Honeymoon Suit            
    PricingDetail-2

----------------------------------------
IEnumerable-合并
凯悦度假村
标准间
PricingDetail-1
PricingDetail-2
高级客房
PricingDetail-1
PricingDetail-2
卧室套装
PricingDetail-2
凉鞋度假村
标准间
PricingDetail-1
PricingDetail-2
消光室
PricingDetail-1
蜜月套装
PricingDetail-2
----------------------------------------

处理这个问题的最佳方法是什么?我尝试了简单的IEnumerable.Union和GroupBy子句,但没有得到我想要的结果。

如果我理解您的意思,您应该使用Concat将它们放入一个大集合中,然后您可以根据需要进行分组

IEnumerable<ResortSupplier> master = 
    result1.Concat(result2).Concat(result3); //etc

我想你想要的是:

// You can construct this with an array if it isn't already in this form.
IEnumerable<IEnumerable<ResortSupplier>> supplierLists = ...

var query = from suppliers in supplierLists
            from supplier in suppliers
            group supplier by supplier.SupplierCode into g

            let products = g.SelectMany(s => s.ResortProducts)
                            .GroupBy(p => p.Code)
                            .Select(prodGroup => new Product
                                    {
                                       Code = prodGroup.Key,
                                       PricingDetail = prodGroup
                                                       .SelectMany(p => p.PricingDetail)
                                                       .ToList()
                                    })

            select new ResortSupplier
            {
                SupplierCode  = g.Key, 
                ResortProducts = products.ToList()                              
            };
//如果此表单中还没有数组,则可以使用数组构造它。
IEnumerable SupplierList=。。。
var查询=来自供应商列表中的供应商
从供应商到供应商
按供应商分组供应商。供应商编码为g
让products=g.SelectMany(s=>s.products)
.GroupBy(p=>p.Code)
.选择(prodGroup=>新产品
{
代码=prodGroup.Key,
PricingDetail=prodGroup
.SelectMany(p=>p.PricingDetail)
托利斯先生()
})
选择新供应商
{
供应商代码=g.键,
ResortProducts=products.ToList()
};

这是一个看起来非常可怕的问题。我强烈建议将查询的不同组件分解为单独的(命名良好的)方法。

FYI Union将删除重复项。Ani,我可以有多个
IEnumerable
,但不能
IEnumerable
。你想让我先从所有的
IEnumerable
构建
IEnumerable
?@Alex:是的。例如:
var supplierLists=new[]{supplierList1,supplierList2,…}Ani,这很有效。谢谢我在
RestortSupplier
中还有一个“最低价格”字段,它将包含所有p.PricingDetail中的最低价格。如何填充此字段?我想我可能必须使用LINQ的
.Min(p=>p.Price)
函数,但我很难构建一个查询。我得到了最低的价格
SelectMany(p=>p.PricingDetail).Min(p=>p.Price)
但是如果我使用where子句,比如
.where(l=>l.Price>0.Min(p=>p.Price),我想要最低的非零价格
它删除价格为零的项目,其中where子句充当过滤器并删除非零记录。我想保持所有记录的完整性,并得到最低的非零价格。亚当,请。请看我对Martinho帖子的评论。我认为你的问题措辞不正确。在你的5个收藏中调用concat将把它们堆积成一个。对这个庞大的集合进行分组将…根据您指定的内容对其进行分组。你到底在期待什么?发生了什么?亚当,也许我在回答问题时没有说得很清楚,但我的例子说明了我预期的结果应该是什么。我为这一混乱道歉。安尼的解决方案对我有效。谢谢