我正在尝试找到以下代码的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);
}
Run Code Online (Sandbox Code Playgroud)
我希望我可以使用类似的东西:
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);
Run Code Online (Sandbox Code Playgroud)
但我还没有找到一种方法来确定循环所在的迭代.任何帮助,将不胜感激!
Ser*_*rvy 23
LINQ没有ForEach方法,并且有充分的理由.LINQ用于执行查询.它旨在从某些数据源获取信息.它不是为改变数据源而设计的.LINQ查询不应该导致副作用,这正是你在这里做的.
该List班确实有一个ForEach方法,这是你使用的是什么.因为它实际上并不在System.Linq命名空间中,所以它在技术上并不是LINQ的一部分.
for你的问题循环没有错.尝试以你想要的方式改变它是错误的(从良好的实践角度来看).
这是一个更详细地讨论此事的链接.
现在,如果您想忽略该建议并使用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++;
}
}
Run Code Online (Sandbox Code Playgroud)
lc.*_*lc. 10
它有点复杂,并创建了一个中间集合,但如何:
donations.Select((x, i) => new {Name = "item_name_" + i, x.AccountName})
.ToList()
.ForEach(x=> nvc.Add(x.Name, x.AccountName));
Run Code Online (Sandbox Code Playgroud)
我不得不说这样做没有任何好处.您使用中间集合创建了更多开销,并且IMHO在原始for循环中失去了可读性.
如果您愿意使用foreach循环代替,也可以跳过中间集合List.ForEach.请参阅@ wageoghe的答案(再次强烈推荐).
小智 8
如果您真的想使用List.ForEach,它很简单:
//[...]
int i=0;
donations.ForEach(x => nvc.Add("item_name_" + i++, x.AccountName);
Run Code Online (Sandbox Code Playgroud)
小智 8
这是一篇旧帖子,但谷歌排名很高,所以我认为更通用的方法是合适的。(另外,我往往忘记这是如何完成的,这意味着我每次都必须谷歌......)
假设一个整数列表:
var values = new List<int>() { 2, 3, 4, 0x100, 74, 0xFFFF, 0x0F0F };
要迭代列表并拥有索引,请执行以下操作:
values.Select((x, i) => new
{
item = x,
index = i
})
.ToList()
.ForEach(obj =>
{
int value = obj.item;
int valueIndex = obj.index;
});
Run Code Online (Sandbox Code Playgroud)