2016-07-08 28 views
0

我有对象合并两个列表,但选择一个具有更高的属性值C#

public class Items 
{ 
    public string Country; 
    public string State; 
    public string City; 
    public DateTime date; 
    public int population; 
} 

的两个列表...

var items1 = new List<Items> 
{ 
    new Item {Country="USA", State="Washington",City="Seattle",date="7/8/2016",population=1000}, 
    new Item {Country="USA", State="Washington",City="Seattle",date="10/8/2016",population=2000}, 
    new Item {Country="USA", State="Washington",City="Seattle",date="12/8/2016",population=3000}, 
    new Item {Country="Canada", State="Ontario",City="Washington",date="10/8/2016",population=3000}, 
}; 


var items2 = new List<Items> 
{ 
    new Item {Country="USA", State="Washington",City="Seattle",date="10/8/2016",population=2500}, 
    new Item {Country="USA", State="Washington",City="Seattle",date="12/8/2016",population=2400}, 
    new Item {Country="Canada", State="Ontario",City="Washington",date="10/8/2016",population=3500}, 
}; 

我想这两个名单上的国家为它们匹配相结合,状态城市和日期,但选择较高的两个人口。

items1.Concat(items2) ...linq or lambda 

导致

{ 
    new Item {Country="USA", State="Washington",City="Seattle",date="7/8/2016",population=1000}, 
    new Item {Country="USA", State="Washington",City="Seattle",date="10/8/2016",population=2500}, 
    new Item {Country="USA", State="Washington",City="Seattle",date="12/8/2016",population=3000}, 
    new Item {Country="Canada", State="Ontario",City="Washington",date="10/8/2016",population=3500}, 
}; 
+1

您的代码没有出现它会编译。这引出了问题,你有没有试图解决它?你的方法(代码)是什么,以及你在哪些方面特别努力? –

+0

它不是一个可编译的代码..只是为了说明我的问题..两个列表......将它们组合并根据某些属性对它们进行分组,并根据较高的人口选择项目。 – BanTim

+0

未来,请告诉我们您已经尝试解决问题。它有很长的路要走。 –

回答

1

GroupBy可能是解决这个问题最棘手的部分。一旦你过去了,在各个分组中找到你需要的各种方法都可以工作。这是一个。

我们首先对四个字段进行匿名分组。然后我们列举每个组,按照总体降序排列值,然后选择第一个结果。

var merged = new List<Item>(items1); 
merged.AddRange(items2); 

IEnumerable<Item> grouped = merged 
    .GroupBy((item) => new { item.Country, item.State, item.City, item.date }) 
    .Select((item) => item.OrderByDescending(i => i.population).FirstOrDefault()); 

foreach(Item item in grouped) 
{ 
    Console.WriteLine($"{item.Country}, {item.State}, {item.City}, {item.date}, {item.population}"); 
} 

结果

USA, Washington, Seattle, 7/8/2016 12:00:00 AM, 1000 
USA, Washington, Seattle, 10/8/2016 12:00:00 AM, 2500 
USA, Washington, Seattle, 12/8/2016 12:00:00 AM, 3000 
Canada, Ontario, Washington, 10/8/2016 12:00:00 AM, 3500 
1

您可以通过Country将两者连接起来列表,然后组,后由​​降序排序各组获得第一有序元素:

 var items1 = new List<Item> 
     { 
      new Item {Country="USA", State="Washington",City="Seattle",population=1000}, 
      new Item {Country="USA", State="Washington",City="Seattle",population=2000}, 
      new Item {Country="USA", State="Washington",City="Seattle",population=3000}, 
      new Item {Country="Canada", State="Ontario",City="Washington",population=3000}, 
     }; 


     var items2 = new List<Item> 
     { 
      new Item {Country="USA", State="Washington",City="Seattle",population=1000}, 
      new Item {Country="USA", State="Washington",City="Seattle",population=2500}, 
      new Item {Country="USA", State="Washington",City="Seattle",population=2400}, 
      new Item {Country="Canada", State="Ontario",City="Washington",population=3500}, 
     }; 

     var items = items1.Concat(items2).GroupBy(i => i.Country).ToList(); 

     foreach (var item in items) 
     { 
      Item itemWithHighestPopulation = item.OrderByDescending(i => i.population).FirstOrDefault(); 

      // Never concatenate strings with '+', I'm just using it for testing purposes 
      Console.WriteLine(itemWithHighestPopulation.City + " " + itemWithHighestPopulation.Country + " " + itemWithHighestPopulation.population); 
     } 
相关问题