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

时间:2014-06-19 11:16:58

标签: c# linq lambda custom-lists

这是给你的假设。如果你有一个字符串列表,是否可以按该字符串中存在的给定字符对该列表进行排名?

考虑这个伪代码:

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或类似的话甚至可以做到这一点吗?

2 个答案:

答案 0 :(得分:13)

假设您想根据*的位置确定字符串的优先级,您可以

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永远不会超过

的一些非常值

See live example

答案 1 :(得分:2)

如果您要使用Contains ..

Contains返回布尔值 - 因此您按真或假排序。由于true为1而0为假 - 您可以根据需要向后排序。所以你想要OrderByDescending

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

哪种排序1 - &gt; 0

Click here for live example on IDEOne.