gpt4 book ai didi

c# - 列表分而治之——按值或引用传递

转载 作者:太空宇宙 更新时间:2023-11-03 20:35:00 25 4
gpt4 key购买 nike

我没有使用 .NET 4。

我从数据源获得了一个巨大的列表。当列表中的元素个数高于X时,我喜欢对列表进行分区,将每个分区分配给一个线程。处理分区后,我想合并它们。

            var subsets = list.PartitionEager(50000);

//var subsets = list.Partition<T>(50000);

Thread[] threads = new Thread[subsets.Count()];
int i = 0;
foreach (var set in subsets)
{
threads[i] = new Thread(() => Convertor<T>(set));
threads[i].Start();
i++;
}

for (int j = 0; j < i; j++)
{
threads[j].Join();
}

转换器方法是一个静态方法,它接受一个列表并进行一些查找。

   public static void Convertor<T>(List<T> list) where T : IInterface        {

foreach (var element in list)
{
**// do some lookup and assing a value to element
// then do more lookup and assign a value to element**
}

}

当我运行这段代码时,即使我知道大多数元素都会被分配一个值。他们实际上返回 null。

我知道列表的副本将传递给该方法,但对元素的任何更改都应反射(reflect)在上层方法中。然而,这只发生在最后一个子集中。

我什至添加了一些代码来将列表合并为一个列表。

                list.Clear();

foreach (var set in subsets)
{
list.AddRange(set);
}

分区代码:

    public static List<List<T>> PartitionEager<T>(this List<T> source, Int32 size)
{
List<List<T>> merged = new List<List<T>>();
for (int i = 0; i < Math.Ceiling(source.Count / (Double)size); i++)
{
merged.Add(new List<T>(source.Skip(size * i).Take(size)));
}

return merged;
}

我做错了什么?如何解决这个问题?我希望在查找后为元素分配值吗?这与同步或参数传递有关吗?

最佳答案

如果 .NET 4 是一个选项,您可以只使用 Parallel.ForParallel.ForEach .这些方法会自动为您处理分区,并在不同系统上跨多个并发度的可伸缩性方面提供许多其他优势。

关于c# - 列表分而治之——按值或引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com