有人可以帮助我吗?我对lambda表达式并不是很强。
protected void Process1(List<SomeClass> mylist)
{
foreach (var item in mylist)
{
if (!SomeClass.Validate(item))
{
continue;
}
DoStuff(item);
DoMore(item);
DoEven(item);
}
}
protected void Process2(List<SomeClass> mylist)
{
foreach (var item in mylist)
{
if (!SomeClass.Validate(item) || item.Value == 0)
{
continue;
}
DoStuff(item);
DoMore(item);
DoEven(item);
}
}
答案 0 :(得分:3)
第二个过程与使用参数
调用第一个过程相同myList.Where(item => item.Value != 0)
或者,如果您需要两种方法:
protected void Process1(IEnumerable<SomeClass> mylist)
{
foreach (var item in mylist)
{
if (!SomeClass.Validate(item))
continue;
DoStuff(item);
DoMore(item);
DoEven(item);
}
}
protected void Process2(IEnumerable<SomeClass> mylist)
{
Process1(myList.Where(item => item.Value != 0));
}
另外,我已将输入参数更改为IEnumerable
(因为您只迭代项目序列)。
答案 1 :(得分:3)
protected void Process1(List<SomeClass> mylist)
{
foreach (var item in mylist.Where(item => SomeClass.Validate(item))
{
DoStuff(item);
DoMore(item);
DoEven(item);
}
}
protected void Process2(List<SomeClass> mylist)
{
foreach (var item in mylist.Where(item => item.Value != 0 && SomeClass.Validate(item))
{
DoStuff(item);
DoMore(item);
DoEven(item);
}
}
我就是这样做的。
答案 2 :(得分:1)
你的意思是这样的吗?
protected void Process(List<SomeClass> mylist, List<Action<SomeClass>> actions)
{
foreach (var item in mylist)
{
if (!SomeClass.Validate(item))
{
continue;
}
foreach(var action in actions)
action(item);
}
}
然后用:
来调用它Process(list, new List<Action<SomeClass>> {DoStuff, DoMore, DoEven});
答案 3 :(得分:0)
您可以做的一件事是使用Linq将验证应用于集合并返回有效的项目。此外,如果需要,您可以将它们链接在一起以应用多个验证。例如:
return myList.Where(item -> !SomeClass.Validate(item))
.Where(item -> !OtherClass.Validate(item))
这将返回仅通过验证的项目的集合,您可以应用“do”所需的任何“内容”。
答案 4 :(得分:0)
Process
方法可以非常通用且可重复使用:
void Process<T>(IEnumerable<T> source, Predicate<T> filter, Action<T> action)
{
foreach (var item in source)
if (filter(item))
action(item);
}
然后你将使用它,例如,像这样:
Process(
list,
i => SomeClass.Validate(i) && i.Value != 0,
i =>
{
DoStuff(i);
DoMore(i);
DoEven(i);
});
答案 5 :(得分:-1)
我不是开始传递名单的忠实粉丝,但是......
protected void Process1(List<SomeClass> myList)
{
myList.Where(item => SomeClass.Validate(item)).ToList()
.ForEach(item =>
{
DoStuff(item);
DoMore(item);
DoEven(item);
});
}
protected void Process2(List<SomeClass> myList)
{
myList.Where(item => SomeClass.Validate(item) && item.Value != 0).ToList()
.ForEach(item =>
{
DoStuff(item);
DoMore(item);
DoEven(item);
});
}