C# 使用“除外”删除元素

C# 使用“除外”删除元素,c#,.net,linq,C#,.net,Linq,下面我有一个方法,可以删除除最新版本之外的所有版本的文件。我的Except调用没有产生我期望的结果,再次查看文档后,我似乎不明白为什么。为了进行调试,我已将带有的LINQ查询从我的foreach条件中移出。当我调试最新的被正确设置为最新的日志文件时,在下一行执行删除后仍然包含最新的,为什么?我错过了什么?所有相关代码如下所示。通过将文件设置为日志名的静态部分来调用该方法,之后该方法具有时间戳。这两个Where(x=>x.Contains(file))完全按照我的预期工作 public stati

下面我有一个方法,可以删除除最新版本之外的所有版本的文件。我的
Except
调用没有产生我期望的结果,再次查看文档后,我似乎不明白为什么。为了进行调试,我已将带有
的LINQ查询从我的foreach条件中移出。当我调试
最新的
被正确设置为最新的日志文件时,在下一行执行
删除后
仍然包含
最新的
,为什么?我错过了什么?所有相关代码如下所示。通过将文件设置为日志名的静态部分来调用该方法,之后该方法具有时间戳。这两个
Where(x=>x.Contains(file))
完全按照我的预期工作

public static void CleanUpLocalCopies(string file)
{
    string[] localFiles = Directory.GetFiles(".\\");

    string newest = files.Where(x => x.Contains(file)).OrderByDescending(x => x).FirstOrDefault();
    var toDelete = localFiles.Where(x => x.Contains(file)).Except(new string[] { newest });

    foreach (string f in toDelete)
    {
        File.Delete(f);
    }
}

在这种情况下,您可以直接使用skip跳过第一个文件,并避免调用
,除非调用

var toDelete = files.Where(x => x.Contains(file)).OrderByDescending(x => x).Skip(1);

这是一个更好的解决方案,因为我会接受它。但是,碰巧你能解释一下为什么我的
除外
不起作用吗?@evanmcdonnal很难说——你发布的代码实际上并没有按原样编译,所以我看不出它到底出了什么问题;)@evanmcdonnal我试过了,用
本地文件替换
文件
(它没有编译),并且工作正常。如果我有3个名为“abc”的文件,后面有时间戳,那么toDelete包含了2个最老的。@Pierre Luccinoult哦,你刚才给了我一个惊喜时刻
files
是包含此方法的类上的属性,它不起作用,因为
files
是我试图删除本地文件时某些FTP共享上的文件列表。。。所以除了
之外的
工作正常,只是在错误的集合上。