从list()中清除重复部分值的最佳方法是什么?
本文关键字:复部 最佳 是什么 方法 清除 string list | 更新日期: 2023-09-27 18:18:21
我正试图从列表中清除重复的值,我不确定最好的方法来做到这一点。
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"answers"Make",并将最后一个保留在列表中,但清除较早的一个,无论"ASC"或"DESC"值如何……我想让它做的是…
//Trim ASC
//Year DESC
//Model ASC
//Make ASC
谢谢…
一种选择是按第一部分分组,然后取每组中的最后一个条目:
List<string> query = sqlOrderBy.GroupBy(x => x.Split(' ')[0])
.Select(g => g.Last())
.ToList();
用你的样本数据运行,我得到:
Trim ASC
Year DESC
Make ASC
Model ASC
这是你想要的吗?
EDIT:要注释排序,这将返回元素的顺序不是原来的顺序,而是第一部分指定的顺序。如果你想要原来的顺序,可以这样做,但它有点时髦:
List<string> query = sqlOrderBy.AsEnumerable()
.Reverse()
.GroupBy(x => x.Split(' ')[0])
.Select(g => g.First())
.Reverse()
.ToList();
(AsEnumerable()
调用只是将List<T>.Reverse
从方程中移除-我们不打算调用它。)
所以我们从结尾开始分组,这意味着分组将以相反的顺序出现,然后我们可以再次反转结果。这给我们的结果是:
Trim ASC
Year DESC
Model ASC
Make ASC
Using MoreLINQ and DistinctBy
:
sqlOrderBy.AsEnumerable().Reverse().DistinctBy(n => n.Split(' ')[0]);