2011-05-15 89 views
2

「的數據儘可能不常見的」從表開始是這樣的:獲取從集合

| Code | Year | 
--------------- 
| A01 | 2001 | 
| A01 | 2002 | 
| B01 | 2002 | 
| C01 | 2003 | 

我要到達這樣的:

| Code | Year | 
--------------- 
| A01 | 2001 | 
| B01 | 2002 | 
| C01 | 2003 | 

我要組的第一列(代碼)和第二年(第二年),與其他所有記錄相比,我必須獲得儘可能少的數據。我嘗試用這個例子來解釋這一點:對於代碼'A01'我有兩年:'2001'和'2002'。我必須採取'2001',因爲它是其他記錄中不會出現的那個。如果沒有可用的值「Year」在其他記錄中不存在,則最好採取任何值。

數據以內存中的數組形式存在並與它們進行交互我使用了一些LINQ查詢。

預先感謝您! Pileggi

回答

1

這是正確的答案(與比較亞歷克斯氮雜的一個:filteredItemsAlexAza和filteredItemsSsithra給出不同的結果,因爲不常見的數據是不是也不再最小的一個 - 爲A01這裏2005年而不是2001年)

class Program 
{ 
    public static void Main(string[] args) 
    { 
     var items = new List<Item> 
     { 
      new Item { Code = "A01", Year = "2005" }, 
      new Item { Code = "A01", Year = "2002" }, 
      new Item { Code = "B01", Year = "2002" }, 
      new Item { Code = "C01", Year = "2003" }, 
     }; 

     var filteredItemsAlexAza = items.Select(cod => cod.Code).Distinct().Select(cod => items.OrderBy(itm => itm.Year).First(itm => itm.Code == cod)).ToList(); 
     var filteredItemsSsithra = items 
      .Select(item => new { Item = item, NbItemsWithSameYear = items.Where(i => i.Year == item.Year).Count() }) 
      .GroupBy(ano => ano.Item.Code) 
      .Select(group => group.OrderBy(ano => ano.NbItemsWithSameYear).First().Item) 
      .ToList(); 
    } 

    public class Item 
    { 
     public string Code { get; set; } 
     public string Year { get; set; } 
    } 
} 
0

你可以谷歌的「協調源代碼」在您的首選實施語言。

2

對不起,我在C#中製作它。希望你不會有問題將其轉換爲VB.NET。

var filteredItems = items 
    .Select(cod => cod.Code).Distinct() 
    .Select(cod => items.OrderBy(itm => itm.Year).First(itm => itm.Code == cod)) 
    .ToList(); 

測試代碼:

public class Item 
{ 
    public string Code { get; set; } 

    public string Year { get; set; } 
} 

public static void Main(string[] args) 
{ 
    var items = 
     new List<Item> 
     { 
      new Item{ Code = "A01", Year = "2001" }, 
      new Item{ Code = "A01", Year = "2002" }, 
      new Item{ Code = "B01", Year = "2002" }, 
      new Item{ Code = "C01", Year = "2003" }, 
     }; 

    var filteredItems = items 
     .Select(cod => cod.Code).Distinct() 
     .Select(cod => items.OrderBy(itm => itm.Year).First(itm => itm.Code == cod)) 
     .ToList(); 
} 
+0

謝謝!這是非常非常少的代碼!對我來說,理解它有點難(用LINQ我還沒有那麼'高級')。然後,我很難在VB中轉換它。你能否幫我多一點,並給我在VB中的查詢? – lamarmora 2011-05-15 18:55:10

+0

盡了全力。對不起,錯誤。我沒有安裝VB.NET來檢查。昏暗distinctCodes =(從項目_ \t選擇item.Code項目).Distinct 昏暗filteredItems = distinctCodes _ 。選擇(功能(COD)items.OrderBy(功能(ITM)itm.Year)。首先(功能(itm)itm.Code == cod))_ .ToList() – 2011-05-15 19:14:03

+0

非常感謝!我有一個小錯誤,我明天應該解決(「不」選擇'可訪問,不可能推斷類型,等等。「)但特別是我必須學習一點,以瞭解這種查詢! – lamarmora 2011-05-15 20:28:31

0

很抱歉,但所提出的解決方案絕對不fullfill Pileggi的初始需求。 「儘可能少的價值」已成爲「最低價值」。 兩者在這種精確的情況下是相匹配的,這給出了Alex Aza的答案是對的錯覺,但這只是巧合。