如何将带有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扩展使其工作。