从集合中获取“尽可能少的数据”

时间:2011-05-15 16:53:09

标签: vb.net linq group-by

从这样的表开始:

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

我必须到达这个:

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

我必须将第一列(代码)和第二列(年份)分组,以便与所有其他记录相比,使数据“尽可能少”。我试着用这个例子解释一下:对于代码'A01',我有2年:'2001'和'2002'。我必须采用'2001',因为它是在其他记录中不再出现的那个。如果没有可用的值'Year'在其他记录中不再出现,那么取任何值都是好的。

数据在内存中以数组的形式存在,并与它们进行交互我使用了一些LINQ查询。

提前谢谢! Pileggi

4 个答案:

答案 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();
}

答案 1 :(得分:1)

这是正确的答案(与Alex Aza的一个比较:filteredItemsAlexAza和filteredItemsSsithra给出不同的结果,因为不太常见的数据也不再是最小的 - 在2005年而不是2001年的A01)

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; }
    }
}

答案 2 :(得分:0)

您可以使用首选实施语言谷歌搜索“Concordance源代码”。

答案 3 :(得分:0)

很抱歉,建议的解决方案绝对没有满足Pileggi的初始要求。 “尽可能不太常见的价值”已成为“最低价值”。 在这个精确的案例中,两者都匹配,这给人一种错觉,即Alex Aza的答案是正确的,但这只是巧合。