如何将带有switch语句的foreach循环转换为LINQ
我有以下建议:如何将带有switch语句的foreach循环转换为LINQ,linq,foreach,Linq,Foreach,我有以下建议: foreach (var x in items) { switch (x.name) { case firstname1: case firstname2: case firstname3:
foreach (var x in items)
{
switch (x.name)
{
case firstname1:
case firstname2:
case firstname3: .
x.Value = somemethodcall;
break;
}
}
开关
有大约15个不同的值要检查。x
有3个属性:name
、value
和enum
常量来检查x.name
items
是包含许多enum
常量的x
对象的集合,但我只想找到某些常量并应用相同的方法来更改x.value
属性
是否可以使用linq将我的foreach转换为一行程序?由于使用switch而不是foreach,您的代码很长
switch (x.name)
{
case firstname1:
case firstname2:
case firstname3:
可以写成
var names = new []{firstname1, firstname2, firstname3};
if (names.Contains(x.name))
items.Select(SetValueByName);
foreach本身可以写成
var names = new []{firstname1, firstname2, firstname3};
if (names.Contains(x.name))
items.Select(SetValueByName);
在哪里
string[] names = new []{firstname1, firstname2, firstname3};
TypeOfX SetValueByName(TypeOfX x)
{
if(names.Contains(x.name))
{
x.Value = somemethodcall;
}
return x;
}
如果优化不适用于您的场景,只需
TypeOfX SetValueByName(TypeOfX x)
{
.. original switch statement
return x;
}
试试这个
items.ToList().Where(x => x.name == firstname1 || x.name == firstname2).ForEach(x => x.Value = somemethodcall)
LINQ用于查询/生成新集合,而不是修改现有对象。如果要从旧的
x
创建新的x
,可以使用LINQ,但如果要就地修改,则不能使用LINQ。LINQ也比使用常规循环慢。在x
中的第三个属性是什么?第三个属性是枚举类型。公共枚举字段{firstName1,firstName2,firstName3….}因此开关(x.name){case fields.firstName1:case fields.firstName2:x.value=methodcall()}谢谢。我的需求需要对列表中的某些项目的属性进行就地更新。在何处选择它们并应用foreach扩展使其工作。