2020年10月12日
川俣晶の縁側ソフトウェアC# コーディング How Tototal 1069 count

【入門級】ソートが失敗するとき

Written By: 川俣 晶連絡先

ソートが失敗するとき §

 ここに、1, 4, 2, 3という値を持ったList<int>クラスのオブジェクトがあるとします。

 これをソートするのは簡単です。Sortメソッドを呼べば1, 2, 3, 4になります。

 サンプルソースのsort1メソッドの通りです。

 しかし、LINQのOrderByメソッドを使おうと思ってサンプルソースのsort2メソッドのように書き換えるとソートしません。

 ソートしない理由は簡単で、Sortメソッドは元データを書き換えますが、OrderByメソッドはソート結果を別の列挙オブジェクトとして返すだけだからです。そして、いくら引数を書き換えても元のデータは書き換わりません。

 どうすれば良いでしょうか?

 サンプルソースのsort3メソッドのようにrefキーワードを付ければ元データの変数が書き換わるので意図通りに動きます。

罠の数々 §

  • サンプルソースのsort3メソッドはオブジェクトの中味を修正したわけではなく、あくまで変数を書き換えただけである。サンプルソースのsort1メソッドと厳密に同じ動作ではないことに注意しよう

参考リンク §

List<T>.Sort メソッド

Enumerable.OrderBy メソッド

Enumerable.ToList<TSource>(IEnumerable<TSource>) メソッド

 Sortメソッド、OrderBy メソッド、ソートという機能は同じだが出自も役割も違う。どこがどう違うのか上記のリンクから確かめてみよう。

リポジトリ §

https://github.com/autumn009/cshowto

sort §

using System;

using System.Collections.Generic;

using System.Linq;

class Program

{

    private static void sort1(List<int> list)

    {

        list.Sort();

    }

    private static void sort2(List<int> list)

    {

        list = list.OrderBy(c => c).ToList();

    }

    private static void sort3(ref List<int> list)

    {

        list = list.OrderBy(c => c).ToList();

    }

    static void Main()

    {

        var list1 = new List<int>() { 1, 4, 2, 3 };

        sort1(list1);

        foreach (var item in list1) Console.Write(item);

        Console.WriteLine();

        var list2 = new List<int>() { 1, 4, 2, 3 };

        sort2(list2);

        foreach (var item in list2) Console.Write(item);

        Console.WriteLine();

        var list3 = new List<int>() { 1, 4, 2, 3 };

        sort3(ref list3);

        foreach (var item in list3) Console.Write(item);

        Console.WriteLine();

    }

}

実行結果

1234

1423

1234

Facebook

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?
キーワード【 川俣晶の縁側ソフトウェアC# コーディング How To
【C# コーディング How To】の次のコンテンツ
2020年
10月
14日
【入門級】ユニークさの保証・その値は配列に一つだけか?
3days 0 count
total 961 count
【C# コーディング How To】の前のコンテンツ
2020年
10月
10日
【入門級】円周率が欲しい
3days 0 count
total 1354 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

https://mag.autumn.org/tb.aspx/20201012111717
サイトの表紙【C# コーディング How To】の表紙【C# コーディング How To】のコンテンツ全リスト 【C# コーディング How To】の入手全リスト 【C# コーディング How To】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.