3

我正在尝试在 C# 中按字母顺序对字符串列表进行排序。我的代码如下所示:

public static List<Result> sort(List<Result> listToSort)
{
    int listSize = listToSort.Count;
    for (int i = 0; i < listSize; i++)
    {
       for (int j = 0; j < listSize; j++)
       {
           if (listToSort[i].SN[0] < listToSort[j].SN[0])
           { 
               Result tempValue = listToSort[j];
               listToSort[j] = listToSort[i];
               listToSort[i] = tempValue;
            }
        }
    }

    return listToSort;
}

但它只是根据字符串的第一个字母对其进行排序。换句话说,如果我有这样的列表:

唐纳德、艾比、戴夫、鲍勃、山姆、皮特

它会这样排序:

艾比、鲍勃、唐纳德、戴夫、皮特、山姆

人们会期望“dave”出现在“donald”之前。有什么想法吗?

4

6 回答 6

3

目前,您仅按第一个字母排序,这就是您看到此结果的原因。您可以使用Enumerable.OrderBy - LINQ

List<Result> sortedList = listToSort.OrderBy(r=> r.SN).ToList();

或者对于您当前的代码,您可以将检查修改为:

if (string.Compare(listToSort[i].SN,listToSort[j].SN) < 0)
于 2012-12-03T12:34:11.617 回答
2

如何为此使用 LINQ:

return listToSort.OrderBy(report => report.SN)

我假设您的Report班级有一个string您希望对列表进行排序的属性?

编辑

没有注意到您已经指定了SN属性,已经修改了我的答案。

于 2012-12-03T12:35:34.413 回答
1

这是因为比较第一个字符串的字符(listToSort[i].SN[0] => 产生输入的第一个字符)。如果要比较字符串值,则应使用 string.Compare() 方法。

--SJ

于 2012-12-03T13:25:35.377 回答
1

你只评估第一个字母。尝试使用传统的排序方法:

    public static void Sort(List<Result> listToSort)
    {
        listToSort.Sort(new ResultComparator());
    }

    public class ResultComparator : IComparer<Result>
    {
        public int Compare(Result x, Result y)
        {
            if (x == null && y == null) return 0;
            if (x == null) return 1;
            if (y == null) return 0;

            // compare based in SN
            return string.Compare(x.SN, y.SN);
        }
    }
于 2012-12-03T12:37:24.167 回答
1
public static List<Result> sort(List<Result> listToSort)
{        
    return listToSort.OrderBy(x=>x.SN[0]).ToList();
}
于 2012-12-03T12:34:34.190 回答
1

看看这部分:

for (int i = 0; i < listSize; i++)
{
   for (int j = 0; j < listSize; j++)
   {
       if (listToSort[i].SN[0] < listToSort[j].SN[0])
       { 

你是

  • 仅在 SN[0] 上进行比较。如果 SN 是一个字符串,那么这就解释了你的主要结果。
  • 总是使用相同的比较,无论是 i < j 还是 i > j

最好的办法是使用内置排序。LinqOrderBy(lambda)是最简单的,但它会创建一个新列表。对于就地排序,请使用List<T>.Sort(Comparer).

如果您必须自己做,请查找一个好的排序算法(维基百科)。

于 2012-12-03T12:34:59.070 回答