C# 将项目从一个列表移动到另一个列表,并且两者都位于列表数组中

C# 将项目从一个列表移动到另一个列表,并且两者都位于列表数组中,c#,C#,我有两个列表数组。两者都有一个随机数的列表,每个列表中都有60个随机数 我想做的是将一个列表中的一半项目移动到另一个列表中。但是,这两个列表都位于自己的列表数组中。我试着查找如何做到这一点,但没有找到任何东西 这是我的两个列表数组。两者都只有两个列表 List<double>[] selection = new List<double>[selectionSize]; List<double>[] crossover = new

我有两个列表数组。两者都有一个随机数的列表,每个列表中都有60个随机数

我想做的是将一个列表中的一半项目移动到另一个列表中。但是,这两个列表都位于自己的列表数组中。我试着查找如何做到这一点,但没有找到任何东西

这是我的两个列表数组。两者都只有两个列表

        List<double>[] selection = new List<double>[selectionSize];
        List<double>[] crossover = new List<double>[2];

如果您需要我提供更多信息,请发表评论。

最简单的方法是使用linq

 crossover.AddRenge(selection.Take(selection.Count()/2));

最简单的方法是使用linq

 crossover.AddRenge(selection.Take(selection.Count()/2));

如果你只想要60个元素的后半部分

 crossover[0].AddRange(selection[0].Skip(30))
将指定集合的元素添加到 名单

从一个数组的开头返回指定数量的连续元素 顺序

绕过序列中指定数量的元素,然后返回 其余的元素

  crossover = selection.Take(2);


如果你只想要60个元素的后半部分

 crossover[0].AddRange(selection[0].Skip(30))
将指定集合的元素添加到 名单

从一个数组的开头返回指定数量的连续元素 顺序

绕过序列中指定数量的元素,然后返回 其余的元素

  crossover = selection.Take(2);


您可以使用Linq,更具体地说,可以使用Take&Skip方法

Take方法从目标序列的开头提取前n个元素,其中n是该方法的参数,并返回一个仅包含所取元素的新序列

Skip方法可以被认为是Take方法的完全相反的方法。其中Take方法返回包含目标序列的前n个元素的序列,Skip方法跳过序列中的前n个元素,并返回包含前n个元素之后剩余元素的新序列

  crossover = selection.Take(2);

给你前两个

 crossover = selection.Skip(2);


在前两个之后提供所有信息。

您可以使用Linq,更具体地说,可以使用Take&Skip方法

Take方法从目标序列的开头提取前n个元素,其中n是该方法的参数,并返回一个仅包含所取元素的新序列

Skip方法可以被认为是Take方法的完全相反的方法。其中Take方法返回包含目标序列的前n个元素的序列,Skip方法跳过序列中的前n个元素,并返回包含前n个元素之后剩余元素的新序列

  crossover = selection.Take(2);

给你前两个

 crossover = selection.Skip(2);


在前两个循环之后提供所有信息。

如果显示导致错误的完整代码以及实际的错误消息本身,这将很有帮助,但是如果使用两个循环,您可以像尝试一样填充列表:每个交叉项一个,另一个用于对应选择数组项的一半,用于将项从选择复制到交叉。然后我们需要调用Add方法将项目添加到列表中,因为交叉列表还没有项目,所以我们无法通过索引访问它们

例如:

for (int i = 0; i < crossover.Length; i++)
{
    // This may be what you were missing - we need to instantiate a new List first
    crossover[i] = new List<double>();

    for (int j = 0; j < selection[i].Count / 2; j++)
    {
        crossover[i].Add(selection[i][j]);
    }
}

如果您显示了导致错误的完整代码以及实际的错误消息本身,这会很有帮助,但是如果您使用两个循环,您可以像尝试那样填充列表:每个交叉项一个循环,另一个用于对应选择数组项的一半,用于将项从选择复制到交叉。然后我们需要调用Add方法将项目添加到列表中,因为交叉列表还没有项目,所以我们无法通过索引访问它们

例如:

for (int i = 0; i < crossover.Length; i++)
{
    // This may be what you were missing - we need to instantiate a new List first
    crossover[i] = new List<double>();

    for (int j = 0; j < selection[i].Count / 2; j++)
    {
        crossover[i].Add(selection[i][j]);
    }
}

这只会移动整个列表,我只想移动列表的一半。这只会移动整个列表,我只想移动列表的一半。这会运行,但会给我这个错误,这与我一开始的错误相同。System.NullReferenceException:“对象引用未设置为对象的实例”。@OwenHodgson那么您的结构不是您认为的那样,并且有些内容为null,我建议您仔细检查您如何初始化对象,此外,在上面插入断点并检查运行时值也可能是值得的。请固定它,谢谢您的帮助。如果我只是想要下半部分,我该如何使用这段代码呢?这段代码会运行,但会给我一个错误,这与我最初遇到的错误相同。System.NullReferenceException:“对象引用未设置为对象的实例”。@OwenHodgson那么您的结构不是您认为的那样,并且有些内容为null,我建议您仔细检查您如何初始化对象,此外,在上面插入断点并检查运行时值也可能是值得的。请固定它,谢谢您的帮助。如果我只想要下半场,我该如何用这段代码呢?代码太多了,所以我不想要它
太让人困惑了,但这和你所说的一样有效。有很多代码,所以我不想让它太让人困惑,但这和你所说的一样有效。