按照特定值对列表进行排序和优先级排序

3

我想要按照优先级对这个字符串列表进行排序。除此之外,普通的字符串排序即可。

在这个例子中,“为什么我这么笨?”是我们能从这个问题中得出的最明显的答案,应该被置于列表的顶部。

static void Main(string[] args)
{
    List<string> stringList = new List<string>() 
    { "foo", "bar", "why am I so dumb?", "tgif" };

    stringList.Sort(StringListSorter);

    stringList.ForEach(x => Console.Out.WriteLine(x));
}

static int StringListSorter(string s1, string s2)
{
    int retVal = 0;

    if (s1 == "why am I so dumb?")
    {
        retVal = -1;
    }
    else
    {
        retVal = s1.CompareTo(s2);
    }

    return retVal;
}

在这个例子中,希望排在列表顶部的字符串位于列表中间。

如果s2"why am I so dumb?"字符串,会怎么样? - MAV
顺便说一下,如果您使用LINQ,代码会更易读:stringList = stringList.OrderByDescending(s => s == "why am I so dumb?").ToList()。这将保持其他字符串的顺序不变,如果您还要对其余部分进行排序,则添加ThenBy(s => s)即可。 - Tim Schmelter
@TimSchmelter 感谢您的评论;我确实同意您对我的问题的更加优雅的方法。在我的实际情况中,我担心排序列表的逻辑随着时间的推移而变得更加复杂,这就是为什么我更倾向于使用List<T>.Sort(Comparer<T>)方法。 - IAmJaeger
@IAmJaeger:在LINQ查询中,您也可以使用方法,而OrderBy使用稳定排序,与List.Sort相反,这意味着如果两个元素相等,则保留原始顺序。但是,List.Sort的主要论点是它可以更有效率,因为它不需要创建新列表,而是对原始列表进行排序。 - Tim Schmelter
2个回答

1

我不理解这个问题 :-) 但是,可能是:

stringList.Sort((s, s1) => s == "why am I so dumb?" ? -1 : s.CompareTo(s1));

或者

stringList.Sort((s, s1) => s == "why am I so dumb?" ? -1 : (s1 == "why am I so dumb?" ? 1 : s.CompareTo(s1)));


我相信后者可以解决问题,而前者在我的初始示例中会有问题。 - IAmJaeger

1
您的比较程序不完整。您已经考虑了 s1 == "why am I so dumb?" 的情况,但没有考虑到 s2 == "why am I so dumb?" 或者两者都是 "why am I so dumb?" 的情况。添加这些情况应该可以解决问题(此外,您可以通过在这些情况下使用 return 来简化它)。
static int StringListSorter(string s1, string s2)
{
    if (s1 == s2)
        return 0;
    if (s1 == "why am I so dumb?")
        return -1;
    if (s2 == "why am I so dumb?")
        return 1;
    return s1.CompareTo(s2);
}

我知道这是某些愚蠢的东西。谢谢!祝你周末愉快! :) - IAmJaeger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接