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

Currently you are only sorting by the first letter that is why you are seeing this result. You can use Enumerable.OrderBy - LINQ

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

Or for your current code you can modify your check to:

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

あなたは最初の文字だけを評価しています。従来の並べ替え方法を使用してみてください。

    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

Take a look at this part:

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

You are

  • only comparing on SN[0]. If SN is a string then that explains your main result.
  • always using the same compare, whether i < j or i > j

Best thing to do is to use a built-in sort. Linq's OrderBy(lambda) is the easiest but it creates a new list. For an in-place sort, use List<T>.Sort(Comparer).

If you do have to do it yourself, look up a good sorting algorithm (wikipedia).

于 2012-12-03T12:34:59.070 に答える
1

It was happened because of comparing character of the first string (listToSort[i].SN[0] => which produces the first character of your input). If you want to compare the string values, you should use string.Compare() method.

--SJ

于 2012-12-03T13:25:35.377 に答える