首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用嵌套集合对多列进行分组

使用嵌套集合对多列进行分组
EN

Stack Overflow用户
提问于 2014-10-31 09:52:32
回答 2查看 197关注 0票数 1

我将集合按多个列分组。如果它们处于相同的嵌套级别,那么很容易将它们分组:

代码语言:javascript
复制
var groupedAirProducts = airproductsPerClient.GroupBy(ac => new
{
    ac.AirProduct.PassengerNameRecord,
    ac.AirProduct.Flights.First().MarketingAirlineCode,
    ac.AirProduct.Flights.First().FlightNo,
    ac.AirProduct.Flights.First().DepartureDate
})

问题是,我不想只按第一次航班分组,但我想包括所有的航班。我想做的是:

代码语言:javascript
复制
var groupedAirProducts= airproductsPerClient.GroupBy(ac =>
{
    ac.AirProduct.PassengerNameRecord,
    foreach(var flight in ac.AirProduct.Flights){
        flight.MarketingAirlineCode,
        flight.FlightNo,
        flight.DepartureDate
    }
})

请注意,上面的代码只是一个想法的说明。这不是一个有效的/适当的代码。我知道怎么做的唯一方法是非常丑陋和复杂。我想知道是否有一种很好的使用LINQ的方法,或者解决这个问题的简单方法。

编辑:解释更多的期望。作为分组的结果,我希望拥有共享相同airProducts的PassengerNameRecord集合,而属于给定航空产品的航班共享相同的MarketingAirlineCode、FlightNo、DepartureDate。我知道如何通过讨好一个PassengerNameRecord集合来实现它,所以航班包括在其中,对其进行分组,所以我有一组共享分组属性的航空产品。然后重建这座破旧的建筑。我本来希望有一种方法可以通过一些集合迭代添加groupBy属性,或者有一种合并分组集合的方法--如果有一种方法让集合按PassengerNameRecord分组,集合按way属性分组并合并到一起,不幸的是,我怀疑是否有一种简单的方法来完成这种合并。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-31 10:15:37

您可以为IEqualityComparer<AirClient> (或其他LINQ方法)实现自定义GroupBy

您可以通过以下方式实现它:

代码语言:javascript
复制
public class AirClientComparer : IEqualityComparer<AirClient>
{
    public bool Equals(AirClient lhs, AirClient rhs)
    {
        if (lhs == null || rhs == null) return false;
        if(object.ReferenceEquals(lhs, rhs)) return true;
        if(lhs.PassengerNameRecord != rhs.PassengerNameRecord) return false;
        if(object.ReferenceEquals(lhs.AirProduct, rhs.AirProduct)) return true;
        if(lhs.AirProduct == null || rhs.AirProduct == null) return false;
        if(object.ReferenceEquals(lhs.AirProduct.Flights , rhs.AirProduct.Flights )) return true;
        if(lhs.AirProduct.Flights.Count !=  rhs.AirProduct.Flights.Count) return false;
        if(lhs.AirProduct.Flights.Count == 0 && rhs.AirProduct.Flights.Count == 0) return true;
        return lhs.AirProduct.Flights.All(f =>
            rhs.AirProduct.Flights.Any(f2 =>
                    f.MarketingAirlineCode == f2.MarketingAirlineCode
                 && f.FlightNo == f2.FlightNo
                 && f.DepartureDate == f2.DepartureDate));
    }

    public int GetHashCode(AirClient obj)
    {
        if(obj.AirProduct == null) return 0;
        int hash = obj.AirProduct.PassengerNameRecord == null 
                  ? 17 : 17 * obj.AirProduct.PassengerNameRecord.GetHashCode();
        unchecked
        {
            foreach(var flight in obj.AirProduct.Flights)
            {
                hash = (hash * 31) + flight.MarketingAirlineCode == null ? 0 : flight.MarketingAirlineCode.GetHashCode();
                hash = (hash * 31) + flight.FlightNo == null ? 0 : flight.FlightNo.GetHashCode();
                hash = (hash * 31) + flight.DepartureDate.GetHashCode();
            }
        }
       return hash;
    }
}

现在您可以在GroupBy中使用它了

代码语言:javascript
复制
var groupedAirProducts = airproductsPerClient.GroupBy(ac => new AirClientComparer());
票数 1
EN

Stack Overflow用户

发布于 2014-10-31 10:12:02

在这种情况下,您需要从内部表开始。内表还需要对外层表的引用,例如您有一个

ICollection<Flight> Flights in AirProduct

您还需要一个Airproduct成员在Flight中。

然后像这样分组你的航班(伪代码)

代码语言:javascript
复制
AirProduct.Flights.groupby( flight => new{ flight.MarketingAirlineCode,
        flight.FlightNo,
        flight.DepartureDate,
        flight.product.PassengerNameRecord
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26671732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档