C# 使用LINQ对列表的所有元素应用谓词

C# 使用LINQ对列表的所有元素应用谓词,c#,linq,C#,Linq,我想通过对每个元素应用谓词函数来更新列表 以下是我在不使用LINQ的情况下的实现方法: for(int i = 0; i < filesToCheck.Count; i++) { while (filesToCheck[i][0] == '/' || filesToCheck[i][0] == '\\') filesToCheck[i] = filesToCheck[i].Substring(1); } for(int i=0;if.TrimStart('/

我想通过对每个元素应用谓词函数来更新列表

以下是我在不使用LINQ的情况下的实现方法:

for(int i = 0; i < filesToCheck.Count; i++)
{
    while (filesToCheck[i][0] == '/' || filesToCheck[i][0] == '\\')
        filesToCheck[i] = filesToCheck[i].Substring(1);   
}
for(int i=0;i

如何使用LINQ做到这一点?

如果您只需要从每个文件名的开头删除一些字符,您可以使用
TrimStart
,然后:

var list = filesToCheck.Select(f => f.TrimStart('/', '\\'));
编辑:当然,您可以在没有LINQ的情况下执行此操作,但这里的主要问题是您的
while
循环,而不是使用
for
:我花了几秒钟的时间在心里解析while循环,以了解它的功能。这并不能传达意图,我必须在精神上执行它才能理解它。或者,您可以这样重写它:

for (int i = 0; i < filesToCheck.Count; i++)
{
    filesToCheck[i] = GetValueWithoutSlashes(filesToCheck[i]);
}

你的问题是什么?我只是想拥有与上面发布的代码相同的行为,但使用LINQ,我不是很擅长。LINQ中的Q代表“查询”-LINQ通常用于读取集合并投影它们,而不是修改它们。@SergeyBerezovskiy,我必须承认,这是看待这个问题的一个非常好的方法。LINQ甚至不是一个人想要的技术。现在,如果你想过滤另一个故事的列表。@罗琳:是:)他应该使用
TrimStart
。重要的是要指出,与问题中修改现有集合的代码不同,这会投影一个新序列。这会产生新的查询,不会修改元素。所以OP需要将其转换为数组并重新分配。在这种情况下,最好创建一个新集合,而不是在一个紧密循环中修改字符串,在过程中创建大量垃圾字符串。谢谢!我使用了
filesToCheck=filesToCheck.Select(f=>f.TrimStart('/','\\')).ToList()@ApocKalipsS很乐意帮忙!所以有时可能是一个愤怒的地方:)
private string GetValueWithoutSlashes(string value)
{ 
    return value.TrimStart('/', '\\');
}