Linqはすごい? その4の回答編といますか、その5です。
4回(15, 13, 12, 17) です。
メソッドで書き直してみました。
あと従来の技術で書いた例もあげておきます。
Accoutクラスも作る必要があります。
foreachは2回なのですが、SortedListを使っている時点で内部でループしているでしょうが・・・
では今までの解説をします。
その1では私がLinqの説明時にいつも使っているクエリをforeachで書きなおしてみました。
おそらく皆さんも今まで書いていたんであろうコードです。
これによってLinqというのはforeachの置き換えだよって気づいてほしかったのです。
Linqはすごい? その1
その2ではそれ(Linqというのはforeachの置き換え)を強調するためにあえて速度比較をしてみました。
その結果ですが多くの方は4倍以上違うのが当たり前のコードをすんなりと受け入れてしまいました。
Linqはすごい? その2
その3ではマイクロソフトのExtensionに似せたコードを作成して4倍以上違う根拠を見せようとしました。
あんまり似ていたので「コード出すのやばいんじゃ」って意見もありましたがあくまで挙動を調べた私のオリジナルです。
Linqはすごい? その3
つまり、一貫してこのシリーズで言いたかったことは「linqというのはforeachの置き換えの技術である」という見過ごされがちな一面です。
その4やその5ではじゃ、どんなふうに置き換わっているのって話です。
Linqはすごい? その4
public class Account
{
public string Name { get; set; }
public int No { get; set; }
public string Prefecture { get; set; }
};
public class Descending : Comparer<int>
{
public override int Compare(int x, int y)
{
return y - x;
}
};
var al = new Account[] {
new Account{Name="とっちゃん",Prefecture="1東京",No=13},
new Account{Name="むたぐちさん",Prefecture="2大阪",No=17},
new Account{Name="επιστημηさん",Prefecture="1東京",No=12},
new Account{Name="中さん",Prefecture="2大阪",No=1},
new Account{Name="えムナウ",Prefecture="1東京",No=15}
};
{
var accounts = al.Where(a => a.No > 10)
.OrderByDescending(a => a.No)
.GroupBy(a => a.Prefecture)
.OrderBy(accPref => accPref.Key);
foreach (var accgroup in accounts)
foreach (var account in accgroup)
Console.WriteLine(account.No.ToString() + "," + account.Name + "(" + account.Prefecture + ")");
}
{
Descending descendingSort = new Descending();
SortedList<int, Account> sortedAccounts = new SortedList<int, Account>(descendingSort);
foreach (var a in al)
{
if (a.No > 10)
{
sortedAccounts.Add(a.No, a);
}
}
SortedList<string, List<Account>> accounts = new SortedList<string, List<Account>>();
foreach (var s in sortedAccounts)
{
List<Account> accountList;
if (accounts.TryGetValue(s.Value.Prefecture, out accountList))
{
accountList.Add(s.Value);
}
else
{
accountList = new List<Account>();
accountList.Add(s.Value);
accounts.Add(s.Value.Prefecture, accountList);
}
}
foreach (var accgroup in accounts)
foreach (var account in accgroup.Value)
Console.WriteLine(account.No.ToString() + "," + account.Name + "(" + account.Prefecture + ")");
}