8

我有一些奇怪的问题,我的所有字符串数组在列表中都有相同的值。这是我的代码:

List<string[]> map_data = new List<string[]>();
string[] map_data_array = new string[11];

for(int i = 0; i < 2000; i++)
{
    map_data_array = PopulateDataFromFile(); // it returns different data every call
    map_data.Add(map_data_array); // store to List
}

map_data_array 总是有不同的数据,我已经通过将断点放在那里进行了验证并检查了它。

问题是map_data所有元素的值都相同。PopulateDataFromFile而这个值是i为1999时从函数中得到的数据。

我做错了什么?:/

4

4 回答 4

12

仅当您将相同的数组放入列表时才会发生这种情况。由于您没有将代码提供给PopulateDataFromFile我们,我们只能猜测会发生什么。确保函数返回new每次创建的单独数组。

于 2013-06-18T11:02:17.570 回答
2

您需要分块处理数据,因为PopulateDataFromFile();看起来一次返回所有数据(或尽可能多的数组可以容纳)。使用扩展方法,您可以执行以下操作:-

List<string[]> map_data = new List<string[]>();
foreach (var batch in PopulateDataFromFile().Batch(11))
{
       map_data.Add((batch.ToArray());
}

扩展方法:-

public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> items, int batchSize)
{
     return items.Select((item, inx) => new { item, inx })
                 .GroupBy(x => x.inx / batchSize)
                 .Select(g => g.Select(x => x.item));
}
于 2013-06-18T11:22:09.213 回答
0

PopulateDataFromFile() 返回具有相同值的字符串数组。

于 2013-06-18T11:13:43.597 回答
-5

在循环中,每次您只需更改 map_data_array 的地址,这就是为什么值总是会更改为从方法调用获得的较新数据的原因。每次重新初始化字符串数组都会有所帮助。它应该看起来像这样

    for(int i = 0; i < 2000; i++)
    {
         string[] map_data_array = PopulateDataFromFile(); // it returns different data every call
         map_data.Add(map_data_array); // store to List
    } 

或者如果它让你感到困惑,你可以通过

    for(int i = 0; i < 2000; i++)
    {             
         map_data.Add(PopulateDataFromFile()); // store to List
    } 
于 2013-06-18T11:06:05.767 回答