C#仅按第一个字母排序字符串

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;
}

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

donald, abby, dave, bob, sam, pete

它将按以下方式进行排序:

abby,bob,donald,dave,pete,sam

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


4
你只会比较第一个字母:if (listToSort[i].SN[0] < listToSort[j].SN[0]) - Joe
6个回答

3

目前您只是按照第一个字母排序,这就是为什么您看到这个结果。 您可以使用Enumerable.OrderBy - LINQ

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

或者针对您当前的代码,您可以修改您的检查方式为:
if (string.Compare(listToSort[i].SN,listToSort[j].SN) < 0)

2
如何使用LINQ实现这个功能:
return listToSort.OrderBy(report => report.SN)

我假设您的“报告”类有一个您想要按其排序的“字符串”属性?编辑:没有注意到您已经指定了“SN”属性,我已经修改了我的答案。

1
public static List<Result> sort(List<Result> listToSort)
{        
    return listToSort.OrderBy(x=>x.SN[0]).ToList();
}

哇,谢谢你,太棒了!完美运行。只需要去掉“SN[0]”,用“SN”替换即可。 - user818700

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,您始终使用相同的比较方式

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

如果您确实需要自己完成排序,请查找一个好的排序算法(维基百科)。


当我只是说'listToSort[i].SN'时,我会收到错误提示,指出运算符'<'不能应用于类型string和string? - user818700
2
正确,字符串不支持重载<等运算符。请使用 'listToSort[i].SN.CompareTo(listToSort[j].SN) < 0 - H H

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);
        }
    }

1
这是由于比较第一个字符串字符引起的(listToSort [i] .SN [0] => 它产生了您输入的第一个字符)。 如果要比较字符串值,应该使用string.Compare()方法。

——SJ


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