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);

Aggregate String[]抓取第一个不同的,但我希望它抓取最后一个不同的

您可以尝试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部分。