【问题标题】:Aggregate String[] grabbing first distinct, but I want it to grab the last distinct聚合字符串 [] 抓住第一个不同的,但我希望它抓住最后一个不同的
【发布时间】:2013-06-25 02:39:05
【问题描述】:

我有一个这样的字符串 string dir =“视频/视频/关于/视频/视频/”

当我运行拆分并通过我的 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);

【问题讨论】:

  • string.Join("/", repeat.GroupBy(x => x).OrderBy(x => x.Count()).Select(x => x.Key)) 也许?

标签: c# linq aggregate


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    考虑使用Select 的重载,它将索引作为转换的一部分(记录在here)。

    如果您想要每个不同元素的最后一个不同元素,您可以尝试使用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 重载)。然后我们过滤到感兴趣的词。我们现在使用GroupBy 来生成IEnumerable<IGrouping<string, Tuple<string, int>>,而不是使用Distinct。由于IGrouping 本身实现了IEnumerable,我们将IGroupings 列表投影到Tuple<string, int> 列表中,方法是在按索引排序时获取每个IGrouping 的最后一个元素。然后我们按索引对新的Tuples 列表进行排序,以便单词保持有序,并投影到元组的string 部分。

    【讨论】:

    • 好吧,我无法反转整个字符串,因为如果反转了类似 video/video/about/about 的内容,它会显示为 about/video,我只想抓住最后一个不同的字符串。跨度>
    • @Spooks 我已经更新了答案以适应更复杂的版本。
    猜你喜欢
    • 2023-04-10
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多