清除列表<string>()?</string>中的重复部分值的最佳方法是什么?

时间:2013-06-14 17:36:36

标签: c# .net

我正在尝试清除列表中的重复值,但我不确定这样做的最佳方法。

List<string> sqlOrderBy = new List<string>();

sqlOrderBy.Add("Trim ASC");
sqlOrderBy.Add("Year ASC");
sqlOrderBy.Add("Make DESC");
sqlOrderBy.Add("Year DESC");
sqlOrderBy.Add("Model ASC");
sqlOrderBy.Add("Make ASC");

我想要弄清楚的是搜索重复的前缀值,例如“Year”和“Make”,并将最后一个保留在列表中但是清除前一个,而不管“ASC”或“DESC”值......我想要它做的是......

//Trim ASC
//Year DESC
//Model ASC
//Make ASC

...谢谢

2 个答案:

答案 0 :(得分:2)

一种选择是按第一部分对其进行分组,然后取每组中的最后一个条目:

List<string> query = sqlOrderBy.GroupBy(x => x.Split(' ')[0])
                               .Select(g => g.Last())
                               .ToList();

使用您的示例数据运行它,我得到:

Trim ASC
Year DESC
Make ASC
Model ASC

这就是你想要的吗?

编辑:要对排序进行评论,这将返回不按原始顺序排列的元素,而是按照指定第一部分的顺序。如果你想要原始订单,它可以完成,但它有点时髦:

List<string> query = sqlOrderBy.AsEnumerable()
                               .Reverse()
                               .GroupBy(x => x.Split(' ')[0])
                               .Select(g => g.First())
                               .Reverse()
                               .ToList();

AsEnumerable()来电只是从等式中移除List<T>.Reverse - 我们不是要调用它。)

所以我们从 end 分组,这意味着组将以相反的顺序出现,然后我们可以再次反转结果。这给了我们以下结果:

Trim ASC
Year DESC
Model ASC
Make ASC

答案 1 :(得分:0)

使用MoreLINQDistinctBy

sqlOrderBy.AsEnumerable().Reverse().DistinctBy(n => n.Split(' ')[0]);