2

我有一个像这样的字符串 string dir =“video/video/About/video/video/”

当我运行拆分并通过我的 linq 语句运行时,它会抓取第一个不同的项目,所以 video/About 但我希望它抓取最后一个可能的不同项。所以关于/视频

所以“视频/视频/关于/视频/视频/”应该等于关于/视频

但“video/video/About/About”仍应等于 video/About

repeat = domain + dir.Split('/')
.Where(x => keep.Contains(x)).Distinct()
.Aggregate((gi, j) => gi + "/" + j) + repeat.Substring(lastSlash);
4

2 回答 2

3

您可以尝试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/

video/video/About/About结果video/About/

于 2013-06-25T02:44:20.157 回答
1

考虑使用Select索引的重载作为转换的一部分(在此处记录)。

如果您想要每个不同元素的最后一个不同元素,您可以尝试相应地使用GroupBy order each 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我们的列表投影IGroupings到一个列表中。然后我们按索引对我们的新列表进行排序,以便单词保持有序,并投影到元组的一部分。Tuple<string, int>IGroupingTuplesstring

于 2013-06-25T02:43:26.540 回答