2016-11-23 52 views
0

我只是习惯使用lambdas和所有这些好东西。但是,我不知道在这种情况下我需要提供什么论点。T []参数在字符串[]。Foreach()

我试图修改I字符串来替换字典中的条目的所有实例与它的值,没什么太花哨,我可以用一个简单的foreach循环做到这一点,但我试图使用它作为学习练习。

到目前为止我的代码如下:

 string maskString = Masks[alias]; 
     Regex regex = new Regex(@"({[\w+|\d]+})"); 
     MatchCollection matches = regex.Matches(maskString); 
     string[] constants = matches.Cast<Match>().Select(m => m.Value).ToArray(); 
     string maskedString = ""; 
     if (constants.All(constant => Constants.ContainsKey(constant))) 
     { 
      constants.ForEach(constant => maskedString = maskedString.Replace(constant, Constants[constant])); 
     } 

不过,我收到此错误:There is no argument given that corresponds to the required formal parameter 'action' of 'Array.ForEach<T>(T[], Action<T>)'。在我看来,我以lambda表达式的形式提供动作,但我不知道为什么它需要另一个数组或我应该给它的数组。

我曾尝试提供它与null,string[]和​​但这些只会导致更多的错误。

我可以使用这种结构进行这种操作吗,还是仅仅使用传统的foreach循环会更实用?

+3

Array.ForEach不是一个扩展方法(这是阵列的只是一个静态方法),所以用这样的:'Array.ForEach(常量,常量=> maskedString = maskedString.Replace(constant,Constants [constant]));'无论如何,当涉及“副作用”时,我更喜欢标准的foreach循环。 – digEmAll

+0

保持简单和可维护性。 LINQ语句可能很有用,但它们也很难解释。 –

+0

@digEmAll我注意到,在您评论之前,通过查看文档(https://msdn.microsoft.com/en-us/library/zecdkyw2(v=vs.110).aspx),我没有真正看到这个评论,直到我发布我的答案,但谢谢你!出于兴趣,为什么它是大多数'IEnumerable '的扩展方法,但不是'[]'? –

回答

1

任何时候,你会更好的使用聚合函数:

maskedString = constants.Aggregate(maskedString, (current, constant) => current.Replace(constant , Constants[constant])); 
+0

我喜欢这个......我很喜欢这个。谢谢! –

+0

@JamesHughes谢谢,你能不能比这么善良,并将答案标记为解决方案:) –

1

看来这是.ForEach()方法的错误使用,它是Array类的static方法,不是扩展方法。有两种方法来正确地执行此:

首先,使用Array.ForEach()静态方法,并提供该阵列作为第一个参数:

Array.ForEach(constants,constant => maskedString = maskedString.Replace(constant, Constants[constant])); 

其次,阵列投射到List<T>第一:

constants.ToList().ForEach(constant => maskedString = maskedString.Replace(constant, Constants[constant])); 

第二种方法不会修改原始数组,因此,如果这是需要你不得不做myArray = myArray.ToList().ForEach().ToArray()。感谢克里斯对这一点。

+0

请注意,你的第二个*不*完美。它将创建一个新的List对象,然后对该对象进行操作。原来的常量数组不会被修改。相反,你需要做'常量=(你的表情)。ToArray();' – Chris

+0

@Chris我实际上并没有修改原始数组,我只是用它来修改一个单独的字符串,但这是一个重要的说明,任何人阅读这个 –

+0

我的观点是,没有一个任务,你的第二个绝对没有。它不仅仅是“如果这是必需的”,因为如果它不是必需的,你可能不会放入你的代码行。 – Chris