2017-09-05 9 views
0

私は2次元配列を注文しようとしていて、苦労しているので、誰かが私に助言を提供できるかどうか疑問に思っていました。Cant use int [、] - c#

私は最初の列の値に応じてすべての行を並べ替えるデータの配列を持っています。即ち

x[0] = {360,0,0,1}  x[0] = {0 ,0,1,0} 
x[1] = {180,0,0,0} to x[1] = {180,0,0,0} 
x[2] = {0 ,0,1,0}  x[2] = {360,0,0,1} 

.OrderByを使用して(X => X [0])エラー:私はSystems.Linqを含むが、それでもエラーを取得してい

'int[,]' does not contain a definition for 'OrderBy and no extension method 'OrderBy'

。ここで

は私のコードの抜粋です:

.. 
using System.Linq; 

public bool signalConditioning(int[,] DCValues) 
{ 
    var DcValuesNormalizeda = DCValues.OrderBy(x => x[0]); 
    return false; 
} 
+1

'x [0]'は何でしょうか? 'x'は何を期待しますか? (私はそれが 'int'であると期待しています...) –

+0

' int [、] 'は' IEnumerable 'を実装していますか? – Enigmativity

+0

私は間違ったアプローチを使用していたことに気付きました。配列をリストに変換して順序付けし、次に配列に変換しました。助けてくれてありがとう。 – Greg3482

答えて

0

シンプルなソリューション:もちろん

 int[,] x = new int[,] 
      { {360,0,0,1}, 
      {180,0,0,0}, 
      {0 ,0,1,0}}; 

     var list = new List<int[]>(); 
     for(int i = 0; i < x.GetLength(0); i++) 
     { 
      var row = new int[x.GetLength(1)]; 
      for(int j= 0; j < x.GetLength(1); j++) 
      { 
       row[j] = x[i, j]; 
      } 
      list.Add(row); 
     } 
     var orderedList = list.OrderBy(r => r[0]).ToList(); 

あなたは結果として配列が必要な場合、あなたはorderedListから、それを再構築する必要があります。

注:あなたがLINQでそれをしたい場合、あなたはこのようにそれを行うことができます

 var list = new List<int[]>(); 
     for(int i = 0; i < x.GetLength(0); i++) 
     { 
      var row = new int[x.GetLength(1)]; 
      Buffer.BlockCopy(x, i *4* x.GetLength(1),row,0, x.GetLength(1)*4); 
      list.Add(row); 
     } 
     var orderedList = list.OrderBy(r => r[0]).ToList(); 
+0

これは多くの助けになりました。私は、これに似たアプローチを使用してクラス配列をリストに変換することで終わりました。その後、重複を削除してリストを並べ替え、配列に変換し直します。 ポインタをありがとう。 – Greg3482

0

が、結果はList<int[]>です:パフォーマンスが重要な場合、あなたはBuffer.BlockCopy(...)と内側のループを置き換えることができます。 2次元配列として結果が必要な場合は、ループを使用してLINQを使用しないで、より良いものにする必要があります。