普通にソートすると、0って一番前に来るんだよね
開発してると、たまに基礎を忘れてしまうので、忘備録
やりたいこと

まずはランダム値を生成
それを、通常ソートしてみると、上の青文字のような感じ
0が先頭に来てしまう
さらに、0を後ろにやるソートをしてみたのが赤文字のとこ
ソースコード
using UnityEngine;
using System.Collections.Generic;
public class Sample : MonoBehaviour
{
List<int> listSample = new List<int>();
void Start()
{
//ランダム値作成
MakeRandom();
//通常のソート実行
RegularASCSort();
//通常のソート実行
RegularDESCSort();
//0を後ろにやるソート実行
ZeroASCSort();
//0を後ろにやるソート実行
ZeroDESCSort();
}
/// <summary>通常降順ソート</summary>
void RegularASCSort()
{
listSample.Sort();
Debug.Log("<Color=blue>■通常昇順ソート</color>");
ShowText();
}
/// <summary>通常降順ソート</summary>
void RegularDESCSort()
{
listSample.Sort((a, b) => b - a);
Debug.Log("<Color=blue>■通常降順ソート</color>");
ShowText();
}
/// <summary>0を後ろにやる昇順ソート</summary>
void ZeroASCSort()
{
listSample.Sort((a, b) =>
{
if (a == 0) return 1;
else if (b == 0) return -1;
else return a - b;
});
Debug.Log("<Color=red>■0を後ろにやる昇順ソート</color>");
ShowText();
}
/// <summary>0を後ろにやる降順ソート</summary>
void ZeroDESCSort()
{
listSample.Sort((a, b) =>
{
if (a == 0) return -1;
else if (b == 0) return 1;
else return b - a;
});
Debug.Log("<Color=red>■0を後ろにやる降順ソート</Color>");
ShowText();
}
/// <summary>ランダム値作成</summary>
void MakeRandom()
{
listSample.Add(0);
for(int i = 0; i < 30; i++)
{
var random = Random.Range(0, 100);
listSample.Add(random);
}
Debug.Log("■ランダム値作成");
ShowText();
}
/// <summary>テキスト表示</summary>
void ShowText()
{
var text = "";
foreach(var list in listSample)
{
if (text == "")
{
text = list.ToString();
}
else
{
text = string.Format("{0}, {1}", text, list.ToString());
}
}
Debug.Log(text);
}
}
解説
通常の昇順ソートはこんな条件でソートされてる
value.Sort((a, b) => a - b)
| 条件 | 返り値 |
| a > b (aが大きい) | + |
| a = b | 0 |
| a < b (bが大きい) | ー |
0を一番後ろにするってことは、
0はどの数字よりも大きいということだから、
上記の条件に従えば、
| 条件 | 返り値 |
| a = 0(a(=0)が大きい事になるので、a>bが当てはまり、+になる) | + |
| b = 0(b(=0)が大きい事になるので、a<bが当てはまり、ーになる) | ー |
| その他 | a – b |
コードを見てみると、こんな感じ
listSample.Sort((a, b) =>
{
if (a == 0) return 1;
else if (b == 0) return -1;
else return a - b;
});
