我正在尝试查找以下代码的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);但是我还没有找到一种方法来确定循环在哪个迭代上。任何帮助都将不胜感激!
发布于 2012-10-25 01:21:45
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++;
}
}发布于 2016-08-06 01:19:33
如果你真的想使用List.ForEach,很简单:
//[...]
int i=0;
donations.ForEach(x => nvc.Add("item_name_" + i++, x.AccountName);发布于 2012-10-25 01:24:22
它有点复杂,并创建了一个中间集合,但如何:
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 (再次强烈推荐)。
https://stackoverflow.com/questions/13054281
复制相似问题