2013-05-17 46 views
0

我需要語法糖的幫助。 我有一個ThisClass [3]和ThatClass [3]。LINQ替換嵌套數組迭代和更新?

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]的字段與ThisClass [0]的值相同,除了它只有2個字段而不是4個。

我想現在更新ThisClass數組中的每個實例,匹配ThatClass數組中對象的索引位置。我可以嵌套循環,但我需要通過LINQ選項來思考。

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

的作品,但我相信可以做得更好。使用C#,.NET 4.5。

回答

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是做查詢,不會導致副作用......我不認爲這是一個很好的適合在這裏。

-1

正如你所要求的LINQ ...這將讓你無關IEnumerable<ThisClass>,並不會修改原始數組。 (我假設thisClassthatClass陣列分別稱爲thisArraythatArray

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

(如果你真的想LINQ和分配它,只是爲它分配回原來的陣列)

+0

@Downvoter,什麼。是。的。問題?他要求** LINQ **,我給** ** LINQ **。我提到它不會修改原來的,它是可行的。我測試過了。問題是什麼? –

+0

你的代碼不起作用,因爲'Select()'是懶惰的。所以,如果你這樣做,什麼都不會發生。這就是爲什麼使用LINQ來做到這一點是一個壞主意的原因之一。 – svick

+0

@svick修正了這個,我忽略了。 –

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();