C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

配列を行単位で並び替える方法

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■100440 / inTopicNo.1)  配列を行単位で並び替える方法
  
□投稿者/ かな (1回)-(2022/08/12(Fri) 13:13:33)

分類:[.NET 全般] 

C#でCSVの内容をReadAllLinesで一括で配列へ格納しているのですが、任意の項目で行単位で並べ替える方法がわかりません。

【配列データ】
並べ替え前
[0]→"みかん,001,500"
[1]→"さくらんぼ,003,300"
[2]→"みかん,001,600"
[3]→"りんご,002,600"

並べ替え後
[0]→"みかん,001,500"
[2]→"みかん,001,600"
[3]→"りんご,002,600"
[1]→"さくらんぼ,003,300"

このように並べ替えたいです。

検索しましたがArrays.sortしか見つけられず、行を並べ替える方法が分かりません。
よろしくお願いいたします。

引用返信 編集キー/
■100441 / inTopicNo.2)  Re[1]: 配列を行単位で並び替える方法
□投稿者/ 魔界の仮面弁士 (3444回)-(2022/08/12(Fri) 13:39:14)
No100440 (かな さん) に返信
> C#でCSVの内容をReadAllLinesで一括で配列へ格納しているのですが、任意の項目で行単位で並べ替える方法がわかりません。

string[] records = ……;

// カンマで区切った 2 列目,3 列目でソート
string[] sorted = (from r in records let c = r.Split(',') orderby c[1], c[2] select r).ToArray();

https://paiza.io/projects/GUd2jNetowwpbZB_5QK8jg
引用返信 編集キー/
■100442 / inTopicNo.3)  Re[1]: 配列を行単位で並び替える方法
□投稿者/ 魔界の仮面弁士 (3445回)-(2022/08/12(Fri) 13:52:06)
No100440 (かな さん) に返信
> 並べ替え後
> [0]→"みかん,001,500"
> [2]→"みかん,001,600"
> [3]→"りんご,002,600"
> [1]→"さくらんぼ,003,300"

データを並び替えたいのではなく、並び替えた結果の 0,2,3,1 という
インデックス順のみを拾いたいのであれば、こんな感じで。


string[] records = File.ReadAllLines(csvFilePath, Encoding.UTF8);

int[] sortedIndexArray = records.Select((s, i) => new { i, c = s.Split(',') }).OrderBy(_ => _.c[1]).ThenBy(_ => _.c[2]).Select(_ => _.i).ToArray();

Console.WriteLine("並び替え後");
foreach (int idx in sortedIndexArray)
{
  Console.WriteLine("[{0}]→\"{1}\"", idx, records[idx]);
}
引用返信 編集キー/
■100443 / inTopicNo.4)  Re[1]: 配列を行単位で並び替える方法
□投稿者/ furu (180回)-(2022/08/12(Fri) 14:24:58)
No100440 (かな さん) に返信
> 検索しましたがArrays.sortしか見つけられず、行を並べ替える方法が分かりません。
Array.Sortだと
魔界の仮面弁士さんのようにstring[] recordsに読み込んだとして

Array.Sort(records, (x, y) =>
    {
        var xl = x.Split(',');
        var yl = y.Split(',');
        var a = xl[1].CompareTo(yl[1]);
        if (a == 0)
            a = xl[2].CompareTo(yl[2]);
        return a;
    });

引用返信 編集キー/
■100444 / inTopicNo.5)  Re[2]: 配列を行単位で並び替える方法
□投稿者/ かな (2回)-(2022/08/12(Fri) 15:09:00)
No100441 (魔界の仮面弁士 さん) に返信

アドバイスありがとうございます。
教えていただいた方法でテストしてみたところソートされました。
今まで見たことのないコーディングで驚きました。
複雑な処理になるとわからなることが多いので、教えていただいたソースを見て勉強したいと思います。

もう1つお聞きしたいのですが、配列の2行目まではヘッダーなので不要なのですが、3行目以降でソートしたいのですが、
foreach (var line in File.ReadAllLines(filename, Encoding.GetEncoding("shift_jis")).Skip(2))
{
string[] values = line.Split(',');
}

という方法で2行目までを飛ばす方法は見つけたのですが、これと教えていただいたソートをどう組み合わせていけばよいのかわかりません。
度々で申し訳ないのですが、教えていただけると助かります。



引用返信 編集キー/
■100445 / inTopicNo.6)  Re[3]: 配列を行単位で並び替える方法
□投稿者/ 魔界の仮面弁士 (3446回)-(2022/08/12(Fri) 15:20:04)
No100444 (かな さん) に返信
> もう1つお聞きしたいのですが、配列の2行目まではヘッダーなので不要なのですが、
> 3行目以降でソートしたいのですが、

読み込み処理の
string[] records = File.ReadAllLines(csvFilePath, Encoding.GetEncoding("Shift_JIS"));

string[] records = File.ReadLines(csvFilePath, Encoding.GetEncoding("Shift_JIS")).Skip(2).ToArray();
に変更すれば先頭 2 行が読み飛ばされるので、後は同様にデータ部だけのソート処理に渡せます。
引用返信 編集キー/
■100446 / inTopicNo.7)  Re[2]: 配列を行単位で並び替える方法
□投稿者/ かな (3回)-(2022/08/12(Fri) 15:27:03)
No100443 (furu さん) に返信

アドバイスありがとうございます。
Array.Sortでの方法を教えていただきありがとうざいます。
今まで単純なプログラミングしかしてこなかったので勉強になります。
配列に対する苦手意識が強いので、理解していきたいと思います。

引用返信 編集キー/
■100448 / inTopicNo.8)  Re[4]: 配列を行単位で並び替える方法
□投稿者/ 魔界の仮面弁士 (3448回)-(2022/08/12(Fri) 15:37:25)
No100445 (魔界の仮面弁士) に追記
> string[] records = File.ReadLines(csvFilePath, Encoding.GetEncoding("Shift_JIS")).Skip(2).ToArray();
> に変更すれば先頭 2 行が読み飛ばされるので、
データ部(3行目以降)だけが欲しい場合は No100445 で良いですが、
もしも先頭 2 行を残しつつ、3 行目以降をソートしたい場合はこんな感じ。


// 全データ。先頭 2 行はヘッダー部です。
string[] records = File.ReadAllLines(csvFilePath, Encoding.GetEncoding("Shift_JIS"));

// 先頭 2 行を残して、3 行目以降を 2 列目, 3 列目にてソートする場合
string[] sorted = records.Take(2).Concat(from r in records.Skip(2) let c = r.Split(',') orderby c[1], c[2] select r).ToArray();
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ