Aggregate String[]抓取第一个不同的,但我希望它抓取最后一个不同的
本文关键字:抓取 我希望 最后一个 String 第一个 Aggregate | 更新日期: 2023-09-27 18:19:41
我有一个这样的字符串string dir="video/video/About/video/video/"
当我运行一个split并运行linq语句时,它会获取第一个不同的项目,所以video/About,但我希望它获取最后一个可能的不同项目。所以关于/视频
因此"video/video/About/video/video/"应等于About/vide
但"video/video/About/About"仍应等于video/About
repeat = domain + dir.Split('/')
.Where(x => keep.Contains(x)).Distinct()
.Aggregate((gi, j) => gi + "/" + j) + repeat.Substring(lastSlash);
您可以尝试Reverse
两次:
string result = domain + dir.Split('/')
.Where(x => keep.Contains(x))
.Reverse() //once before Distinct
.Distinct()
.Reverse() //and again afterwards
.Aggregate((gi, j) => gi + "/" + j) + repeat.Substring(lastSlash);
因此video/video/About/video/video/
结果为About/video/
和CCD_ 4结果到CCD_ 5
考虑使用Select
的重载,该重载将索引作为转换的一部分(此处记录)。
如果您想要每个不同元素中的最后一个不同元素,您可以尝试使用GroupBy
对每个IGrouping
进行相应的排序,并获取每组的正确元素。
repeat = domain + dir.Split('/')
.Select((word, index) => Tuple.Create(word, index))
.Where(x => keep.Contains(x.Item1))
.GroupBy(x => x.Item1)
.Select(g => g.OrderByDescending(x => x.Item2).First())
.OrderBy(x => x.Item2)
.Select(x => x.Item1)
.Aggregate((gi, j) => gi + "/" + j) + repeat.Substring(lastSlash);
在这里,我们将每个单词与其索引耦合(使用上面提到的Select
重载)。然后我们筛选出感兴趣的单词。我们现在不再使用Distinct
,而是使用GroupBy
来生成IEnumerable<IGrouping<string, Tuple<string, int>>
。由于IGrouping
本身实现了IEnumerable
,我们通过按索引排序时取每个IGrouping
的最后一个元素,将IGroupings
的列表投影到Tuple<string, int>
的列表中。然后,我们根据索引对新的Tuples
列表进行排序,使单词保持有序,并投影到元组的string
部分。