从这样的表开始:
| 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
答案 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的答案是正确的,但这只是巧合。