0

私はこの配列を持っています:

int[] a = {5, 2, 3}; 
int[] b = {4, 1, 2}; 
string[] c = {"John", "Peter", "Max"};

たとえば、2番目の配列(b [])の値を並べ替える必要がありますが、他の2つの配列との関係で、それに応じて並べ替えられます。たとえば、1は最小の数値であるため最初に来ます。また、1inはinとinにb[]関連しているため、とは最初の並べ替え位置にも移動することを意味します。同じことが他の2つの列にも当てはまります。観察する:2a[]"Peter"c[]2"peter"

int[] a = {2, 3, 5}; 
int[] b = {1, 2, 4}; 
string[] c = {"Peter", "Max", "John"};

どうすればいいですか?

4

4 に答える 4

8

私はあなたが言っていることを理解していると思います。の値に基づいて配列aをソートしたいとします。cb

配列を別の配列で並べ替えることがArray.Sortできます。これを使用すると、次のようにキーに別の配列を指定できます。

int[] a = { 5, 2, 3 }; 
int[] b = { 4, 1, 2 };
string[] c = { "John", "Peter", "Max" };

Array.Sort(b.ToArray(), c);
Array.Sort(b.ToArray(), a);
Array.Sort(b);
Console.WriteLine(string.Join(", ", a));
Console.WriteLine(string.Join(", ", b));
Console.WriteLine(string.Join(", ", c));

これにより、期待値が出力されます。ToArrayキーで並べ替えるときに配列のコピーを作成するために使用することに注意してくださいArray.Sort。これは、不要なキーと値の両方を並べ替えるためです。bキー(この場合)は最後までソートされません。

それが私たちがあなたの当面の問題を解決する方法です。ただし、コメントから収集すると、表形式のデータを並べ替えようとしています。データに何らかの構造がある場合は、次のように言います。

public class Item
{
    public int A { get; set; }
    public int B { get; set; }
    public string C { get; set; }
}

ずっと簡単になります。

var items = new[]
{
    new Item {A = 5, B = 4, C = "John"},
    new Item {A = 2, B = 1, C = "Peter"},
    new Item {A = 3, B = 2, C = "Max"},
};
var sortedItems = items.OrderBy(i => i.B).ToArray();

これはLINQ、あなたがやろうとしていることに最適なを使用します。

于 2012-06-01T19:44:10.750 に答える
1

データを個別の関連付けられていない配列に格納する代わりに、タプルを確認するか、可能であれば、専用のクラスを使用してデータをリンクしたままにすることをお勧めします。

于 2012-06-01T19:38:54.513 に答える
1

各アイテムがレコード全体を表すように配列を統合できますか?

// using anonymous types for simplicity
var source = new[] {
    new { a = 5, b = 4, c = "John" },
    new { a = 2, b = 1, c = "Peter" },
    new { a = 3, b = 2, c = "Max" }
};
var results = source.OrderBy(x => x.a);
于 2012-06-01T19:40:12.880 に答える
0
var indices = Enumerable.Range (0, a.Length).ToArray ();
var sortedIndices = indices.OrderBy (j => a [j]);

var i = 0;
foreach (var j in sortedIndices) {
   anew [i] = a [j];
   bnew [i] = b [j];
   cnew [i] = c [j];
   i++;
}
于 2012-06-01T19:43:57.617 に答える