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



我正试图从列表中清除重复的值,我不确定最好的方法来做到这一点。

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"one_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]);

最新更新