c# - List<T>.ForEach 带索引

标签 c# linq generics

我正在尝试查找与以下代码等效的 LINQ:

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);
}

我希望我可以使用类似的东西:

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);

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

最佳答案

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

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

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

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

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

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++;
    }
}

关于c# - List<T>.ForEach 带索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13054281/

相关文章:

c# - LINQ 查询以选择与成对数组匹配的行

c# - 是否可以使用 linq(查询语法)中的范围变量作为参数?

java - 在 Java 中实例化 Dictionary<T, U> 错误

java - 在返回类型中使用通配符与定义的泛型类型有何不同?

java - Mockito.any() 通过泛型接口(interface)

c# - XmlDocument.CreateDocumentType 方法超时

c# - UserPrincipal.GetAuthorizationGroups() 方法出错

c# - 在 MongoDB 中计数不正确

c# - WebRequest 将 URL 转换为 Xamarin 中的编码 (MonoTouch)

c# - 正则表达式:以特定字符开头,后跟任何字符的模式中的任何字符串