2011-05-26 36 views
1

可以說我有汽車獲取的兩個列表與特定標準的交叉

列表1的兩個列表:

  • 「法拉利」,2005年,以 「$ 350,000」
  • 「寶馬」,2009年, 「$ 29,000名」
  • 「奧迪」,2011年, 「$ 33,000名」

列表2:

  • 「無限」,2005年, 「$ 267,000個」
  • 「寶馬」,2009年, 「$ 45,000名」
  • 「法拉利」,2005年, 「$ 330,000」
  • 「豐田」,2009年, 「$ 35,000個」

我知道我可以通過使用Intersect方法來獲取重複汽車列表。但我也想保留價格較低的那個。例如,我想一些方法將返回:

  • 「法拉利」,2005年, 「$ 330,000」
  • 「寶馬」,2009年, 「$ 29,000名」

,因爲這些都是重複的車與名稱和他們有最小的價格

回答

3

完全未經測試,但如何呢?

var result = from c1 in List1 
      join c2 in List2 on c1.Name equals c2.Name 
      select new CarInfo() 
      { 
       Name = c1.Name, // Doesn't really matter which you take 
       Year = c1.Price < c2.Price ? c1.Year : c2.Year, 
       Price = c1.Price < c2.Price ? c1.Price : c2.Price 
      }; 
1

是這樣的嗎?我假設您已爲相交的CarComparer IEquality位。

var cheapCars = list1.Intersect(list2, new CarComparer()). 
    OrderBy(c => c.Price). 
     GroupBy(c => c.Name). 
      Select(g => g.FirstOrDefault()); 

您可能必須修復語法...

0

下面的查詢將匹配BrandYear性能的汽車。如果您只關心Brand,則可以更改連接標準以達到該目的。

var results = from car1 in list1 
       join car2 in list2 
       on new { car1.Brand, car1.Year } 
       equals new { car2.Brand, car2.Year } 
       select (car1.Price <= car2.Price) ? car1 : car2;