我正在尝试清除列表中的重复值,但我不确定这样做的最佳方法。
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
...谢谢
答案 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)
使用MoreLINQ和DistinctBy
:
sqlOrderBy.AsEnumerable().Reverse().DistinctBy(n => n.Split(' ')[0]);