嵌套数组迭代和更新的LINQ替换

本文关键字:LINQ 替换 更新 数组 迭代 嵌套 | 更新日期: 2023-09-27 18:14:21

我需要一些语法糖的帮助。我有一个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]的字段值与ThisClass[0]相同,只是它只有2个字段而不是4个。

我现在想更新ThisClass数组中的每个实例,使用ThatClass数组中对象的匹配索引位置的字段。我可以做嵌套的for循环,但我需要帮助来考虑LINQ选项。

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

工作,但我相信可以做得更好。使用c#, . net 4.5.

嵌套数组迭代和更新的LINQ替换

我认为没有必要嵌套循环:

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

您可能会在ThisClass中添加CopyFrom(ThatClass)方法,从而导致:

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

…但我只会这么做。LINQ是用查询,不会产生副作用…我觉得这里不合适。

注意:正如@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();

当你要求LINQ…这将得到一个与无关的 IEnumerable<ThisClass>,,并且不会修改原始数组。(我假设thisClassthatClass数组分别称为thisArraythatArray)

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

(如果你真的想要LINQ和分配它,只要把它分配回原来的数组)