2012-04-12 8 views
0

2D配列のようなものがあれば;LINQを使用して2D配列を選択してソートする

{ 
    {"12", "Animal", "Cat"} 
    {"20", "Animal", "Dog"} 
    {"6", "Vegetable", "Carrot"} 
    {"5", "Mineral", "Iron"} 
} 

LINQを使用してデータを選択し、2番目の「列」と言うように注文することはできますか?以下のような(C#のLINQ好ましく)

+1

配列は悪いコードのにおいで、一般的にあなたが本当作成したいです代わりにそれらのリストを保持してください。 –

+0

これは複数の区切り文字列を一時的に格納するものです。 –

答えて

6

何か:

var sorted = array.OrderBy(x => x[1]) 
        .ToArray(); // Or ToList, or nothing... 

は、それはあなたが "データを選択" によって何を意味するかは明らかではありません。個人的には、各行に文字列を配列するのではなく、より強く型付けされたデータモデルを作成しようとします。もちろん、同様にLINQで簡単に十分なことを行うことができます。

var sorted = array.Select(row => new Item { 
          Id = int.Parse(row[0]), 
          Category = row[1], 
          Name = row[2] 
          }); 
        .OrderBy(x => x.Category) 
        .ToArray(); 

EDIT:最初のクエリ式のバージョンの場合:

var sorted = (from x in array 
       orderby x[1] 
       select x).ToArray(); 

をあなたが見ることができるように、それは使用するよりも雑然とです拡張メソッドを直接。どちらのフォームにも快適な価値があるので、任意の状況で最も簡単なものを選ぶことができます。

+0

ニックにはしませんが、 'select'ステートメントの後に誤ったセミコロンがあります。 –

+0

ありがとう、私は、インラインlinqではなく拡張メソッドでこれをやろうとしていました。興味のないものは、インライン文を使用して同等のものは何ですか? –

+0

@ Rob2211:編集しました。この場合、拡張メソッドの構文を使用することをお勧めします。 –

0

データの一時的な格納であっても、目的の最終結果がソートされた文字列データ(つまり、タスクがテキストファイルをソートする場合)でない限り、コードを明確にするために匿名型を使用します。

あなたがstring[][]なくstring[,]を持っていると仮定すると、私はこれを行うだろう:

var query = from row in array 
      let record = new { ID = int.Parse(row[0]), Category = row[1], Name = row[2] } 
      orderby record.Category 
      select record; 

var sortedData = query.ToArray(); 

拡張メソッドの構文を:配列の

var sortedData = array 
    .Select(row => new { ID = int.Parse(row[0]), Category = row[1], Name = row[2] }) 
    .OrderBy(record => record.Category) 
    .ToArray(); 
関連する問題