C#使用Linq合并两列表作为GridView数据源时setup_fee总为第一行值问题
问题原因
核心错误是使用了Zip方法做集合合并,没有按关联键匹配。Zip方法的逻辑是严格按两个集合的元素索引位置一一配对,只要products.Item1和productsCurrencies.Item1的排序规则不一致、或者元素数量不匹配,就会出现配对错误。你遇到的setup_fee始终等于第一行值的情况,就是因为两个集合排序不匹配,导致所有产品都和第一条货币数据配对了。
修复方案
将Zip替换为LINQ的Join方法,以两个类共有的product_number作为关联键做匹配,代码如下:
// Get models var products = await API.Zelkon.Products.GetAll(); var productsCurrencies = await API.Zelkon.CurrenciesBackend.Get(); // 按product_number关联两个集合,替代原来的Zip逻辑 var results = products.Item1.Join( productsCurrencies.Item1, p => p.product_number, c => c.product_number, (p, c) => new { Product = p, Currency = c } ); // Create datasource var datasource = results.Select(r => new { r.Currency.price, r.Currency.setup_fee, r.Product.product_number }); GridProducts.DataSource = datasource; UI.CustomizeGridDefault(GridProducts);
补充说明
- 如果需要保留没有对应货币信息的产品,可以改用LINQ左连接写法,避免过滤掉无货币数据的产品
- 关联前可以先检查两个集合中
product_number的唯一性,避免一对多关联产生重复的产品条目
内容的提问来源于stack exchange,提问作者Nicklas Christensen
相关产品推荐
相关产品推荐

