大数据量多线程处理并将结果合并List<T>

大数据量多线程处理并将结果合并成一个List

场景

我有一个List<String> userIds , 此集合装了10万个用户id, 现在要调用淘宝接口, 将这10万个用户的订单信息s查询出来, 存入到我的系统中
(或者类似的场景, 都可看此文章)

工具函数

    /**
     * 按千供给
     * 将resources, 按照一千一组, 分割成若干组, 一组一组的调用function
     * 最终结果合并成一个List
     *
     * @param resources 原始list
     * @param function  批处理函数
     * @param async     是否异步
     * @param <T>       入参List泛型
     * @param <V>       出参List泛型
     * @return 最终结果
     */
    public static <T, V> List<V> supplyByThousand(List<T> resources, Function<List<T>, List<V>> function, boolean async) {
        if (CollUtil.isEmpty(resources)) {
            return Collections.emptyList();
        }
        List<List<T>> groups = CollUtil.split(resources, DEFAULT_BATCH_SIZE);
        if (async) {
            return groups.stream().parallel().flatMap(group -> function.apply(group).stream()).collect(Collectors.toList());
        } else {
            return groups.stream().flatMap(group -> function.apply(group).stream()).collect(Collectors.toList());
        }
    }

使用

List<TaobaoOrder> orders = Lambdas.supplyByThousand(userIds, idGroup -> taobaoTemplate.findByUserIds(idGroup), async);
// 共查询出30万条订单信息

这样你就拿到了10万用户的所有订单信息.

额外知识

如果你想一个一个用户的查询, 可参考该函数中的.stream().parallel()并行流机制

userIds.stream()
	.parallel()
	.flatMap(userId->taobaoTemplate.findByUserId(userId).stream())
	.collect(Collectors.toList())

注意:
像这种大量多线程的场景, 只适合I/O场景(调数据库, 调http接口, 调rpc, 读文件等…)
如果你的场景是做数学运算, 金额统计等CPU场景, 则多线程会降低效率, 建议直接for循环.

<think>好的,我现在需要帮助用户解决关于如何给C#中的List<string>赋值的问题。用户之前询问过如何在Unity中将List数据分配给GameObject作为ToggleGroup成员,现在他们可能想更深入了解如何操作List<string>的赋值。 首先,我应该回顾用户的历史对话,确保回答的一致性。之前的回答涉及在Unity中实例化Toggle绑定数据,所以这次可能需要更基础的C#知识,但也要考虑用户可能仍在Unity环境下使用。 用户的问题比较基础,但需要详细说明不同的赋值方法。可能需要分步骤讲解,包括初始化时赋值、逐个添加、集合初始化器、数组转换、其他集合转换、循环赋值以及结合构造函数的方法。同时,要提醒一些注意事项,比如空引用异常和性能问题。 我需要确保回答结构清晰,符合用户之前要求的步骤式结构。同时,要使用中文,避免专业术语过于复杂,但又要准确。可能需要提供代码示例,解释每个方法的适用场景。 另外,用户可能是在Unity中使用List<string>,所以在注意事项中可以提到Unity的序列化问题,比如public字段在Inspector中的显示,以及性能优化建议,比如预先分配容量。还要注意线程安全问题,不过这在Unity中可能不太常见,但最好还是提一下。 需要检查代码示例是否正确,比如集合初始化器是否在C#版本中可用,确保语法正确。例如,使用AddRange方法是否正确,转换数组或列表是否可行。 最后,总结不同方法的适用场景,帮助用户根据具体情况选择合适的方法。确保回答覆盖用户可能的需求,无论是基础赋值还是高级用法,如LINQ和JSON转换,但不过于深入,以免让初学者感到困惑。</think>在C#中给`List<string>`赋值有以下多种方式,以下是详细操作指南: --- ### **1. 初始化时直接赋值** ```csharp // 方式1:使用集合初始化器 List<string> names = new List<string> { "张三", "李四", "王五" }; // 方式2:通过构造函数传入数组 string[] arr = { "苹果", "香蕉", "橘子" }; List<string> fruits = new List<string>(arr); ``` --- ### **2. 逐个添加元素** ```csharp List<string> colors = new List<string>(); colors.Add("红色"); colors.Add("绿色"); colors.Add("蓝色"); ``` --- ### **3. 批量添加元素** ```csharp // 方式1:使用AddRange方法 List<string> cities = new List<string>(); cities.AddRange(new[] { "北京", "上海", "广州" }); // 方式2:合并其他集合 var tempList = new List<string> { "C#", "Java" }; List<string> languages = new List<string>(); languages.AddRange(tempList); ``` --- ### **4. 通过LINQ赋值(需引入System.Linq)** ```csharp // 从数组转换 int[] numbers = { 1, 2, 3 }; List<string> numberStrings = numbers.Select(n => n.ToString()).ToList(); // 过滤转换 List<string> filtered = numberStrings.Where(s => s.Length > 1).ToList(); ``` --- ### **5. 动态生成内容** ```csharp List<string> dynamicList = new List<string>(); for(int i=0; i<5; i++){ dynamicList.Add($"项目_{i+1}"); // 生成:项目_1, 项目_2... } ``` --- ### **6. 特殊赋值方式** ```csharp // 重复值填充 List<string> repeated = Enumerable.Repeat("默认值", 10).ToList(); // 从文件读取(需System.IO) List<string> lines = File.ReadAllLines("data.txt").ToList(); ``` --- ### **▌ 注意事项** 1. **空值处理**:使用前建议先初始化列表 ```csharp List<string> safeList = new List<string>(); // 避免NullReferenceException ``` 2. **容量预分配**(优化性能) ```csharp List<string> optimizedList = new List<string>(100); // 预先分配容量 ``` 3. **不可变列表**(.NET 6+) ```csharp ImmutableList<string> fixedList = ImmutableList.Create("A", "B", "C"); ``` --- ### **▌ Unity特殊用法** ```csharp // 在Inspector面板显示可编辑列表 [SerializeField] private List<string> weaponList = new List<string>(); // 通过JSON赋值 [System.Serializable] class DataWrapper { public List<string> items; } void LoadData(){ string json = "{\"items\":[\"剑\",\"盾\",\"药水\"]}"; DataWrapper data = JsonUtility.FromJson<DataWrapper>(json); weaponList = data.items; } ``` --- ### **最佳实践建议** 1. 需要频繁修改数据时使用`List<T>` 2. 只读场景建议转换为`IReadOnlyList<string>` 3. 多线程操作时考虑使用`ConcurrentBag<T>` 4. 超大数量级(百万级)数据建议使用数组 选择赋值方式时应根据具体场景: - 初始化固定内容 → 集合初始化器 - 动态生成 → 循环+Add() - 外部数据接入 → AddRange()/LINQ - 配置数据 → JSON/XML反序列化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值