首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带索引的List<T>.ForEach

带索引的List<T>.ForEach
EN

Stack Overflow用户
提问于 2012-10-25 01:14:08
回答 10查看 63.7K关注 0票数 23

我正在尝试查找以下代码的LINQ等价物:

代码语言:javascript
复制
NameValueCollection nvc = new NameValueCollection();

List<BusinessLogic.Donation> donations = new List<BusinessLogic.Donation>();
donations.Add(new BusinessLogic.Donation(0, "", "", "");
donations.Add(new BusinessLogic.Donation(0, "", "", "");
donations.Add(new BusinessLogic.Donation(0, "", "", "");

for(var i = 0; i < donations.Count(); i++)
{
    // NOTE: item_number_ + i - I need to be able to do this
    nvc.Add("item_number_" + i, donations[i].AccountName);
}

我希望我能用到这样的东西:

代码语言:javascript
复制
NameValueCollection nvc = new NameValueCollection();

List<BusinessLogic.Donation> donations = new List<BusinessLogic.Donation>();
donations.Add(new BusinessLogic.Donation(0, "", "", "");
donations.Add(new BusinessLogic.Donation(0, "", "", "");
donations.Add(new BusinessLogic.Donation(0, "", "", "");

donations.ForEach(x => nvc.Add("item_name_" + ??, x.AccountName);

但是我还没有找到一种方法来确定循环在哪个迭代上。任何帮助都将不胜感激!

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-10-25 01:21:45

LINQ没有ForEach方法,这是有充分理由的。LINQ用于执行查询。它的设计目的是从某些数据源获取信息。它不是为改变数据源而设计的。LINQ查询不应该引起副作用,这正是您在这里要做的。

List类确实有一个ForEach方法,这就是您正在使用的方法。因为它实际上不在System.Linq名称空间中,所以从技术上讲它不是LINQ的一部分。

您的问题中的for循环没有任何问题。(从良好的实践角度来看)试图以您正在尝试的方式来改变它是错误的。

Here是一个更详细地讨论这个问题的链接。

现在,如果您想忽略该建议并使用ForEach方法,那么编写一个提供操作索引的方法并不难:

代码语言:javascript
复制
public static void ForEach<T>(this IEnumerable<T> sequence, Action<int, T> action)
{
    // argument null checking omitted
    int i = 0;
    foreach (T item in sequence)
    {
        action(i, item);
        i++;
    }
}
票数 28
EN

Stack Overflow用户

发布于 2016-08-06 01:19:33

如果你真的想使用List.ForEach,很简单:

代码语言:javascript
复制
//[...]
int i=0;
donations.ForEach(x => nvc.Add("item_name_" + i++, x.AccountName);
票数 18
EN

Stack Overflow用户

发布于 2012-10-25 01:24:22

它有点复杂,并创建了一个中间集合,但如何:

代码语言:javascript
复制
donations.Select((x, i) => new {Name = "item_name_" + i, x.AccountName})
    .ToList()
    .ForEach(x=> nvc.Add(x.Name, x.AccountName));

这使用the overload of Enumerable.Select which incorporates the index

我不得不说,这样做并没有什么真正的好处。使用中间集合会产生更多的开销,并且在原始的for循环中失去可读性。

如果您愿意使用foreach循环而不是List.ForEach,也可以跳过中间集合。请参阅@wageoghe's answer (再次强烈推荐)。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13054281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档