2016-08-19 8 views
0

のための#のLINQの使用LINQクエリの書き込みダブル:Cループ機能

double[Z][Y] Function (double[Z][Y] matrix){ 
    double Tem[Z][Y] ; 
    for (int i; i<Z; i++){ 
     matrix[i][0] == 0 ? Tem[i][0] =1 :( 
     for (int j; j<Y; j++){ 
      if(matrix[i][j] > 0) Tem[i][j] = 1; 
      elseif(matrix[i][j] < 0) Tem[i][j] = -1; 
      else Tem[i][j] = Tem[i][j-1]; 
     }) 
    } 
    return Tem; 
} 

今私は2次元のListlinqの代わりfor loopC#構文に変換します。 ここでは、各行のクエリを開始するときに、else Tem[i][j] = Tem[i][j-1];の場合、Tem[i][j-1]は常に円弧値matrixであり、実際には新しいTem[i][j-1]を使用してTem[i][j]に割り当てます。とにかく、あなたは正しい解決策を見せてくれますか?

私は、以前の新しい値Tem[i][j-1]を呼び出していますが、元の値はmatrix[i][j-1]ではありません。

+0

あなたのC++コードは正しく見えません。それはコンパイルされず、未割り当ての 'Tem'変数をいくつかの問題として使用しています。あなたは何をしようとしているのですか? – Enigmativity

+0

@ Enigmativityコードを変更しましたが、主なことはC#で二重の 'forループ'によって達成されることです(二次元リストを使用して) – user6703592

+0

元の質問はここを参照してください:http://stackoverflow.com/questions/ 39013033 /。 –

答えて

3

LINQは入力要素(「LINQは割り当てを行いません」と記述されているコメント作成者の1人)を変更しませんが、LINQを使用して1つの入力要素を取得して1つの出力要素を作成できます。これのための関数はEnumerable.Selectです。

Selectは、ソースコレクションから1つのオブジェクトを取り出し、それを出力コレクションの1つのオブジェクトに変換します。この出力オブジェクトは、任意のタイプでよい。

LINQのためにdouble型のオブジェクトは、[] [] doubleの配列の配列として考えることができます:あなたのダブル[] []を簡単に変換されます。

double[][] matrix = ... 
IEnumerable<IEnumerable<double>> mySequence = matrix; 

mySequence内のすべての要素がシーケンスでありますダブルスのmySequenceのすべての要素に対して、ダブルスの配列を作成する、またはより一般的なものを作成したい:ダブルスのシーケンスを作成する:IEnumerable < double>これは、遅延実行を使用できるという利点がある。配列が本当に必要な場合は、後でいつでもToArray()を使用できます。

問題は、シーケンスの前の要素を使用することです。ほとんどのLINQ関数は、現在の入力要素を列挙子から取得します。

double[] innerSequence = ... 
var tuples = innerSequence.Skip(1).Zip(innerSequence, 
    (x, y) => Tuple.Create(x,y) 

各タプルは現在、あなたinnerSequenceの前の要素が含まれ、最初のを除いて: 幸いにも、Enumerable.Zipを使用して、あなたは現在、ダブル、以前のダブルを含むタプルのシーケンスにinnersequenceを変換することができます最初の要素は前の要素を持たないため、シーケンスの要素となります。 mySequence各innerSequence innerSequencesと のシーケンスである場合、上記のコードの続き

var A = mySequence.Select(innerSequence => 
    // for every element in this sequence of doubles 
    // you want the tuple of the element and its previous element 
    outerElement.Skip(1).Zip(outerElement, (x,y) => Tuple.Create(x,y)); 

の配列がだから今Aは、各タプルは、現在の組合せであり、タプル配列の配列であります要素と前の要素:

結果のすべての要素iは、タプルの配列になりました。 要素[0]今タプルの配列である:

  • (行列[0] [1]、行列[0] [0])
  • (行列[0] [2]は、行列[0 [1])
  • (マトリックス[0] [3]、マトリックス[0] [2])
  • など

要素[1]:

  • (行列[1] [1]、行列[1] [0])
  • (行列[1] [2]は、行列[1] [1])

var B = A.Select(tupleSequence => tupleSequence.Select(tuple => // use tuple with element and previous element to decide which // items to select

すべてのタプルが現在の要素とPRを含んでいます明らかに要素 内部シーケンスのdoubleを作成するためにこれを使用してください)