dthy
@dthy (dorrrothy)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Aの配列をソートさせてBの配列も全く同じ動きをさせる

before
int [] A={3,8,5,4,1}
int [] B={1,2,3,4,5}

after
int[] A=[1,3,4,5,8}
int[] B=[5,1,4,3,2}

語彙力がなくうまく伝わらなかったら申し訳ないです。
二つの配列でAの配列をArray.Sort(A)でソートしたときに
afterのようにBの配列にもAの配列と同じ動きをさせたいです。
このような処理をさせる方法はありますか?
またこんなやり方あるけどみたいなのあれば教えていただきたいです。

0

4Answer

Array.Sortではなく、LINQでやってみた。
Bのソート結果だけがほしいのなら、

> var A = new[] { 3, 8, 5, 4, 1 };
> var B = new[] { 1, 2, 3, 4, 5 };
> A.Zip(B, (a, b) => (a, b)).OrderBy(e => e.a).Select(e => e.b).ToArray()
int[5] { 5, 1, 4, 3, 2 }

Aのソート結果、Bのソート結果の両方がほしければ、

> var result = A.Zip(B, (a, b) => (a, b)).OrderBy(e => e.a).ToArray();
> var resultA = result.Select(e => e.a).ToArray();
> var resultB = result.Select(e => e.b).ToArray();
> resultA
int[5] { 1, 3, 4, 5, 8 }
> resultB
int[5] { 5, 1, 4, 3, 2 }
3Like

Comments

  1. @dthy

    Questioner

    2パターンもありがとうございます!
    参考にします!

AとBをzipして、
Aのほうにある値でソートしちゃえば良さそう。

C#は、大昔に触ったぐらいなので、具体的なコードを出すことはできないですが…。
C#にも、コレクションメソッドのzipはあるみたいなので、たぶん、いけると思います。

Enumerable.Zip メソッド (System.Linq) | Microsoft Docs https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.zip?view=netcore-3.1

2Like

Comments

  1. ```scala
    var A=List(3,8,5,4,1)
    var B=List(1,2,3,4,5)
    A.zip(B).sortBy(_._1)
    val S = A.zip(B).sortBy(_._1)
    A=S.map(_._1)
    B=S.map(_._2)
    ```

    Scalaでは、こうなんですが、これをC#に移植していただければ :pray: …って感じです。
  2. @dthy

    Questioner

    ありがとうございます!
    zipは初めて聞きました参考にしてみます!

Array.Sortバージョン
並び換え対象のキーの集合、それにひもづく要素の集合というの配列を引数に取るArray.Sort<TKey, TValue>(TKey[], TValue[])メソッドを利用します。

> var A = new[] { 3, 8, 5, 4, 1 };
> var B = new[] { 1, 2, 3, 4, 5 };
> Array.Sort(A, B);
> A
int[5] { 1, 3, 4, 5, 8 }
> B
int[5] { 5, 1, 4, 3, 2 }
1Like

上で回答されている内容で、簡潔で全然問題ないと思うのですが、
せっかくなので少し違う観点で別パターンを考えました。

たぶん、AとBは何かしら関連のある2つの情報だと思うので、
そういうものは最初にクラスとしてまとめておくと後々の処理が楽だったりしますので、
後続処理が長々あるようであればこの方法も検討してみてください。

var records = A.Select((a, i) => new {ValueA = a, ValueB = B[i]}).OrderBy(x => x.ValueA).ToArray();

var sortedA = records.Select(r => r.ValueA).ToArray();
var sortedB = records.Select(r => r.ValueB).ToArray();

バラバラに、同じ型の配列の変数をたくさん作ると、
使う変数を間違えたりしてバグりやすくなります
極力クラスの配列などでまとめておいて、必要なときだけintなどの配列を作るのが
実際の大きな開発のときには、個人的にはおすすめです

0Like

Comments

  1. @dthy

    Questioner

    ありがとうございます!
    こちらも参考にさせていただきます。

Your answer might help someone💌