0

シンタックス シュガーの助けが必要です。ThisClass[3] と ThatClass[3] があります。

public class ThisClass
{
    public string Thing1;
    public string Thing2;
    public string Thing3;
    public string Thing4;
}

public class ThatClass
{
    public string Thing1;
    public string Thing2;
}

ThatClass の配列内の各インスタンスは、配列 ThisClass の同じ位置にあるインスタンスに基づいて作成されました。そのため、ThatClass[0] には、4 ではなく 2 つのフィールドしかないことを除いて、ThisClass[0] と同じ値を持つフィールドがあります。

ここで、ThisClass 配列内の各インスタンスを、ThatClass 配列内のオブジェクトの一致するインデックス位置からのフィールドで更新したいと思います。ネストされた for ループを実行することもできますが、LINQ オプションについて考える助けが必要です。

 ThisClass[0].Thing1 = ThatClass[0].Thing1; 
 ThisClass[0].Thing2 =  ThatClass[0].Thing2;

動作しますが、もっとうまくできると確信しています。C#、.NET 4.5 を使用。

4

3 に答える 3

7

入れ子になったループは必要ないと思います:

for (int i = 0; i < theseClasses.Length; i++)
{
    theseClasses[i].Thing1 = thoseClasses[i].Thing1;
    theseClasses[i].Thing2 = thoseClasses[i].Thing2;
}

CopyFrom(ThatClass)にメソッドを追加する可能性があり、次のThisClassようになります。

for (int i = 0; i < theseClasses.Length; i++)
{
    theseClasses[i].CopyFrom(thoseClasses[i]);
}

...しかし、それは私がするすべてです。LINQは、副作用を引き起こさずにクエリを実行します...ここでは適切ではないと思います。

于 2013-05-17T20:15:11.423 に答える
1

注意: @Jon が述べたように、LINQ は副作用を引き起こすものではありません。そうすると、予期しない動作をするコードになる可能性があります (ただし、可能です)。

このコードはそれを行います:

ThisClass[] these = new ThisClass[100];
ThatClass[] those = new ThatClass[100];

// init these and those items

those.Zip(these, (that, @this) =>
{
    @this.Thing1 = that.Thing1;
    @this.Thing2 = that.Thing2;
    return that;
}).ToList();
于 2013-05-17T21:06:03.770 に答える
-1

あなたがLINQを求めているように...これは無関係な IEnumerable<ThisClass>,ものを取得し、元の配列を変更しません。thisClass(とのthatClass配列はそれぞれ と と呼ばれるthisArrayと仮定していthatArrayます)

thisArray.Select((n, x) => { n.Thing1 = thatArray[x].Thing1; n.Thing2 = thatArray[x].Thing2; return n; }).ToArray();

(本当に LINQ と割り当てが必要な場合は、元の配列に割り当て直してください)

于 2013-05-17T20:25:59.890 に答える