在字符串中存在特定字符的排序列表

本文关键字:字符 排序 列表 字符串 存在 | 更新日期: 2023-09-27 18:09:26

给你一个假设。如果你有一个字符串列表,是否有可能根据字符串中存在的给定字符对列表进行排序?

考虑以下伪代码:

List<String> bunchOfStrings = new List<String>;
bunchOfStrings.Add("This should not be at the top");
bunchOfStrings.Add("This should not be at the top either");
bunchOfStrings.Add("This should also not be at the top");
bunchOfStrings.Add("This *SHOULD be at the top");
bunchOfStrings.Add("This should not be at the top");
bunchOfStrings.Add("This should be *somewhere close to the top");
buncOfStrings.OrderBy(x => x.Contains("*"));

在上面的代码中,我想重新排序列表,以便每当在字符串中出现星号(*)时,它将该字符串放在列表的顶部。

如果这是可能的LINQ或类似的想法吗?

在字符串中存在特定字符的排序列表

假设您希望根据*的位置对字符串进行优先级排序,您可以执行

bunchOfStrings.OrderByDescending(x => x.IndexOf("*"))

使用OrderByDescending,因为对于不包含*的字符串它们将返回-1


实际上,进一步研究这一点,它不会直接与IndexOf一起工作。OrderByDescending将通过寻找最高的排名索引来工作,在您的情况下,这将是this should be *somewhere close to the top而不是this *SHOULD be at the top,因为*在该字符串中具有更高的索引。

所以要让它工作,你只需要稍微操纵一下排名,使用OrderBy代替

bunchOfStrings.OrderBy(x => {
    var index = x.IndexOf("*");
    return index < 0 ? 9999 : index;
});

注意- 9999只是一个任意值,我们可以假设IndexOf永远不会超过

参见实例

如果Contains是你想使用的…

Contains返回布尔值-因此您按真或假排序。因为真为1,0为假——你是在按你想要的顺序倒序。所以你要输入OrderByDescending:

bunchOfStrings.OrderByDescending(x => x.Contains("*"))

排序1 -> 0

点击这里查看IDEOne的实例