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的答案是对的错觉,但这只是巧合。