Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在LINQ中进行字符串替换?_C#_Regex_Linq_List - Fatal编程技术网

C# 如何在LINQ中进行字符串替换?

C# 如何在LINQ中进行字符串替换?,c#,regex,linq,list,C#,Regex,Linq,List,以下是我正在尝试做的,但没有成功。我想从列表1中的x调用,并在列表2中加入y,其中regex.Match(x.Value).Success。完成这些步骤后,我需要调用String.Replace两次x.Value。然后调用上的,然后选择运算符。我希望它看起来像第二个例子。这怎么可能实现呢 下面是我的列表的样子: list1 list2 Name Value Name Value item.1 $(prod1) prod1 prodVal1

以下是我正在尝试做的,但没有成功。我想从列表1中的x调用
并在列表2中加入y,其中regex.Match(x.Value).Success
。完成这些步骤后,我需要调用
String.Replace
两次
x.Value
。然后调用
上的
,然后选择
运算符。我希望它看起来像第二个例子。这怎么可能实现呢

下面是我的列表的样子:

list1              list2
Name    Value      Name    Value
item.1  $(prod1)   prod1   prodVal1
item.2  $(prod2)   prod2   prodVal2
item.3  prod3      prod3   prodVal3
updatedList         
Name    Value     
item.1  prodVal1   
item.2  prodVal2       
item.3  prod3      
以下是我的列表的外观:

list1              list2
Name    Value      Name    Value
item.1  $(prod1)   prod1   prodVal1
item.2  $(prod2)   prod2   prodVal2
item.3  prod3      prod3   prodVal3
updatedList         
Name    Value     
item.1  prodVal1   
item.2  prodVal2       
item.3  prod3      
示例1(这是我目前拥有的):

例2:

var commonItems = from x in list1
                  join y in list2
                  where regex.Match(x.Value).Success
                  //do x.Value.Replace("$(", "")
                  //do x.Value.Replace(")", "")
                  //then call
                  on x.Value equals y.Name
                  select new { Item = x, NewValue = y.Value };

foreach (var x in commonItems)
{
    x.Item.Value = x.NewValue;
}

如果我理解正确,您希望在查询中使用

var commonItems = from x in list1
                  join y in list2
                  let newX = x.Value.Replace("$(", "").Replace(")", "")
                  where regex.Match(x.Value).Success
                 &&  newX == y.Name
                  select new { Item = newX, NewValue = y.Value };

是否确实需要
Regex.Match
?你可以不使用它获得相同的结果,无论如何我添加了两个版本

在1°版本中,可以使用简单的If语句检查值是否已更改

NewValue = x.Value != x1 ? y.Value: x.Value 
示例代码

鉴于这一类

class MyClass
{
    public string Name { get; set; }
    public string Value { get; set; }
}

添加项目

        var list1 = new List<MyClass>();
        list1.Add(new MyClass { Name = "item.1", Value = "$(prod1)" } );
        list1.Add(new MyClass { Name = "item.2", Value = "$(prod2)" });
        list1.Add(new MyClass { Name = "item.3", Value = "prod3" });

        var list2 = new List<MyClass>();
        list2.Add(new MyClass { Name = "prod1", Value = "prodVal1" });
        list2.Add(new MyClass { Name = "prod2", Value = "prodVal2" });
        list2.Add(new MyClass { Name = "prod3", Value = "prodVal3" });
结果

item.1 prodVal1
item.2 prodVal2
item.3 prod3

PS:我认为您不需要
Regex
,但以防万一,这个版本可以使用它

var q = from x in list1
        let x1 = x.Value.Replace("$(", "").Replace(")", "")
        join y in list2 on x1 equals y.Name
        select new
        {
            Item = x.Name,
            NewValue = Regex.Match(x.Value, x1).Success ? x.Value : y.Value
        };

let之前需要在哪里,我得到了这个错误:
预期的上下文关键字'on'
@BenScotch检查let中的文档,选择要返回原始值还是字符串后面的值。替换?最后不应该得到一个列表吗?commonItems列表。在您的示例中,您有两个列表……列表1中是否真的有空值?这会使事情复杂化query@Vland我将其更改为不包含null。为什么item.3在updatedList中获取prod2作为值?需要regex.match,因为我只需要对匹配的对象进行替换。@BenScotch我在select语句中添加了IF。试试看,第3项没有得到它的值replaced@BenScotch还添加了Regex版本,只需检查select语句中的.Success值,就可以知道是否需要更改该值以及我需要Regex的原因,这样我就可以检查需要替换的值,否则,替换的人比应该的多。你绝对应该得到公认的答案@BenScotch我理解您的需要Ben,这就是为什么在两个版本中我们都检查
x1
(替换的字符串)是否等于
x.value
。所以我们知道什么时候应该接受新的价值观,什么时候应该坚持旧的价值观<对于比简单的字符串相等性检查复杂得多的模式搜索,通常需要code>Regex
。无论如何,谢谢你的投票,祝你好运:)