在C#中如何获取foreach循环的索引?用于数据库表更新
解决方案
要在遍历giveBackBuffets时获取循环索引,从而匹配OldSelectedProductsCount数组的对应元素,你可以替换掉List.ForEach方法(该方法的委托不支持索引参数),改用以下几种方式实现:
方法1:普通for循环
这是最直接的方式,通过索引直接访问集合和数组元素:
byte[] OldSelectedProductsCount = ThisFactor.BuffetServices.Where(q => q.FactorID == ThisFactor.FactorID).Select(q => q.Count).ToArray(); // 先校验集合与数组长度一致,避免索引越界 if (giveBackBuffets.Count != OldSelectedProductsCount.Length) { throw new InvalidOperationException("giveBackBuffets集合长度与OldSelectedProductsCount数组长度不匹配"); } for (int i = 0; i < giveBackBuffets.Count; i++) { var buffetItem = giveBackBuffets[i]; _Buffet.Update(new BuffetViewModel() { BuffetID = buffetItem.BuffetID, Name = buffetItem.Name, Price = buffetItem.Price, Count = buffetItem.Count + OldSelectedProductsCount[i], }); }
方法2:LINQ Select带索引遍历(C# 7.0+)
利用Enumerable.Select的重载方法获取索引,结合元组语法简化代码:
byte[] OldSelectedProductsCount = ThisFactor.BuffetServices.Where(q => q.FactorID == ThisFactor.FactorID).Select(q => q.Count).ToArray(); foreach (var (buffetItem, index) in giveBackBuffets.Select((item, idx) => (item, idx))) { // 同样建议先校验索引是否在数组范围内 if (index >= OldSelectedProductsCount.Length) { throw new IndexOutOfRangeException("索引超出OldSelectedProductsCount数组范围"); } _Buffet.Update(new BuffetViewModel() { BuffetID = buffetItem.BuffetID, Name = buffetItem.Name, Price = buffetItem.Price, Count = buffetItem.Count + OldSelectedProductsCount[index], }); }
方法3:用Zip方法配对集合与数组(更安全)
如果希望避免索引操作,可使用Enumerable.Zip将两个集合按顺序配对,自动匹配对应位置的元素:
byte[] OldSelectedProductsCount = ThisFactor.BuffetServices.Where(q => q.FactorID == ThisFactor.FactorID).Select(q => q.Count).ToArray(); // 按顺序配对两个集合的元素 var pairedItems = giveBackBuffets.Zip(OldSelectedProductsCount, (buffet, oldCount) => new { Buffet = buffet, OldCount = oldCount }); foreach (var pair in pairedItems) { _Buffet.Update(new BuffetViewModel() { BuffetID = pair.Buffet.BuffetID, Name = pair.Buffet.Name, Price = pair.Buffet.Price, Count = pair.Buffet.Count + pair.OldCount, }); }
注意:
Zip会以较短的集合长度为基准配对,若两个集合长度不一致,多余的元素会被忽略,需根据业务需求判断是否要处理这种场景。
内容的提问来源于stack exchange,提问作者hossein shahmohamadi
相关产品推荐
相关产品推荐

