首页 > 解决方案 > c# - 使用 LinQ 在列表中查找重复项,如果是,则更新对象属性

问题描述

我有一个对象类型为 FLightInfo 的 Allflights列表。

如果列表中的对象具有相同的航班号和起飞时间。我想合并这些条目并添加他们的用户数

示例:这是我的清单:

我希望输出如下:

FlightNumber 123  Takeoff 12:00 Users 13
FlightNumber 256  Takeoff 3:00  Users 6  
FlightNumber 651  Takeoff 5:00  Users 3

我的源代码:

struct FlightInfo
        {
            public string FlightNumber { get; set; }
            public string Takeoff_time { get; set; }
            public string Landing_time { get; set; }
            public int UserCount { get; set; }
}

static List<FlightInfo> allFlights = new List<FlightInfo>();

//I read several files using multi-threading and create a FlightInfo object   
//and add it to the allFlights list

allFlights.Add(buildFlight(FlightNumber, Origination, Destination, Takeoff_time, Landing_time, UserCount);

//This is what I need to do
//if FlightNumber && testTakeOff object attributes are the same 
// I want to consolidate those entries and add the UserCount from those entries

标签: c#listlinqduplicatesconsolidation

解决方案


您正在寻找的可以通过GroupBy<TSource,TKey,TElement,TResult>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>, Expression<Func<TKey,IEnumerable<TElement>,TResult>>, IEqualityComparer<TKey>)

使用你的对象定义你可以做这样的事情

var consildatedFlights = allFlights.GroupBy(x => new {x.FlightNumber, x.Takeoff_time}, x => x,
            (key, vals) => ConsolidateFlightInfo(vals));

foreach(var flight in consildatedFlights)
    Console.WriteLine($"FlightNumber: {flight.FlightNumber}, Takeoff Time: {flight.Takeoff_time}, User Count: {flight.UserCount}");

public static FlightInfo ConsolidateFlightInfo(IEnumerable<FlightInfo> flights)
{
    var list = flights.ToList();
    var ret = list[0];
    ret.UserCount = list.Sum(x => x.UserCount);
    return ret;
}

第一个参数.GroupBy指定描述要分组的属性的匿名类型。第二项指定您想要的结果列表中的内容(每组一个)。在这种情况下,我们需要整个航班信息对象。第三个参数指定您希望如何转换每个分组。在这种情况下,我们将每组分组航班传递给一个方法,该方法求和UserCount并返回具有该总和值的单个航班FlightInfo


推荐阅读