我可以使用 LINQ 来实现这个吗?

3
我可以使用LINQ来完成以下两个任务吗:
1. 检查 IEnumerable<string> 中的每个元素是否具有正确的扩展名。如果没有,则抛出异常。
foreach(var filepath in filepaths)
    if(Path.GetExtension(filepath) != @".xml")
        throw new ArgumentException(...);


2. 将一个 IEnumerable<string> 中的所有元素序列化为一个字符串,并在每个元素之间添加空格。


string args = "";
foreach (var filepath in filepaths)
    args += filepath + " ";

谢谢


2
如此心动只想回答:“是的” ^^ - Christian Klauser
@SealedSun 如果你喜欢被踩,那就继续吧。 :) - bzlm
2个回答

8
if (!filepaths.All(x => Path.GetExtension(x) == @".xml"))
{
  throw error;
}

使用 string.Join(" ", filepaths.ToArray()) 来回答第二个问题。

1
这只是一个微不足道的细节,但从技术上讲,它与 OP 的代码有功能上的区别:如果序列为空,它将抛出异常。 - Ani
@Ani:对于“全部”,如果序列为空,则返回“true”。 - leppie
@leppie:是的,完全正确,这就是与OP代码不同之处的原因。 - Ani
@Ani:他的不行,你的可以。好好想想。 - Ani
2
总结 - 我错误地陈述了 !All(predicate)Any(!predicate) 在空序列上的行为不同,但是 @leppie 正确地告诉我这并不是事实。 - Ani
显示剩余11条评论

5

1.

if(filePaths.Any(filepath => Path.GetExtension(filepath) != @".xml"))
     throw new ArgumentException(...);

2.

string args = string.Join(" ", filePaths.ToArray());

或者,使用LINQ (效率更低):

string args = filePaths.Aggregate("", (combined, path) => combined + " " + path);

效率低?你有数据支持吗? - bzlm
2
Linq会效率低下,因为字符串类型是不可变的,使用Aggregate连接所有实例会表现较差。 - danijels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接