OrderByが効かない原因と、Sortとの違い【C#】

Uncategorized

ListとかDictionaryとかをソートしたい時、OrderByを使う方法があるけど、
なぜかSortができなくて

OrderByが効かなかった間違った使い方

私がやっていたミスはこんな感じ

using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class OrderBy : MonoBehaviour {

    List<int> sample;

	void Start () {
	sample = new List<int> { 3, 5, 1, 2, 4 };

        Print("ソート前:");

        sample.OrderBy(it => it);

        Print("ソート後:");
    }

    void Print(string sampleString)
    {
        foreach (var s in sample)
        {
            sampleString += s.ToString();
        }
        Debug.Log(sampleString);
    }
}

ソートできてない
でも、Sortだと効く。

void Start () {
  sample = new List<int> { 3, 5, 1, 2, 4 };
  Print("ソート前:");
  sample.Sort();
  Print("ソート後:");
}

私の何がいけなかったか、お気づきでしょうか?

OrderByはIOrderedEnumerable<T>を返す

IOrderedEnumerable<T>は、IEnumerable<T>を継承したもの。
OrderByは、IOrderedEnumerable<T>を返すんだよね。
Sortの場合は、インスタンス自信をソートしてくれるけど、
OrderByの場合は、ソートしたものを、返す。
つまり、

sample.Sort();

はOK
OrderByの場合は

var sample2 = sample.OrderBy(it => it);

って、やらなきゃいけない。
ちなみに、ここでのsample2の型はIOrderedEnumerable<int>になってるよ。
上記のミスを正す場合は

List<int> sample = new List<int>{3, 5, 1, 4, 2};
sample = sample.OrderBy(it => it);

ってやればいいけど、ここでエラーが
sample.OrderBy()の返り値はIOrderedEnumerable<int>
List<int>のsampleには代入できないので、List型にキャストしてあげればOK

sample = sample.OrderBy(it => it).ToList();

ってやってあげればオッケー

タイトルとURLをコピーしました