2

我正在使用 FileSystemWatcher 类来监视文件夹并在事件出现时更新列表。我正在使用以下类来保存每个文件的信息:

public class FileItem
{
    public string Name { get; set; }
    public string Path { get; set; }
}

以下列表包含该信息的集合:

public static List<FileItem> folder = new List<FileItem>();

我在列表中添加了一些 FileItem 对象。但是,要删除具有匹配名称的特定项目,我不能只使用 foreach() 循环,因为枚举会更改,并且一旦删除文件,就会出现异常。因此,我添加了一个中断(因为只有一个同名文件)以在删除项目后打破 foreach() 循环......但我不确定这是否是最有效的方法它。有没有更简单更合适的方法?这是我的删除代码:

private static void OnChanged(object source, FileSystemArgs e)
{
    if (e.ChangeType == WatcherChangeTypes.Deleted)
    {
        foreach (var item in folder)
        {
            if (item.Name == e.Name)
            {
                folder.Remove(item);
                folder.TrimExcess();
                break;
            }
        }
    }
}
4

4 回答 4

6

您可以通过 linq 填充任何项目,然后将其从列表中删除

List<FileItem> folder = new List<FileItem>();
folder.Remove(folder.SingleOrDefault(x=>x.Name == "myname"));
folder.Remove(folder.SingleOrDefault(x => x.Path == "mypath"));
于 2013-09-09T01:45:40.670 回答
2

怎么样

private static void OnChanged(object source, FileSystemArgs e)
{
    if (e.ChangeType == WatcherChangeTypes.Deleted)
    {
        FileItem item = folder.SingleOrDefault(x => x.Name == e.Name);

        if (item != null)
            folder.Remove(item);
    }
}
于 2013-09-09T01:43:24.447 回答
1

您可以尝试使用 for 循环

for(int x = folder.Count() - 1; x>=0; x--)
{
  if (folder[x].Name == e.Name)
    {
      folder.Remove(folder[x]);
    }
}
于 2013-09-09T01:50:45.410 回答
1

如果你可以重组你的数据,这里有一个Dictionary<>基础的方法:

// let the key be Name, and value be Path.
public static Dictionary<string, string> folder = new Dictionary<string, string>();

private static void OnChanged(object source, FileSystemArgs e)
{
    if (e.ChangeType == WatcherChangeTypes.Deleted)
    {
        folder.Remove(e.Name);
    }
}

随着规模的增加,这将更加高效folder,因为Dictionary<>操作摊销 O(1) 而List<>.RemoveO(n)。

这也明确地执行了“只有一个同名文件”的合同,因为这是Dictionary<>.

您可能希望传入StringComparer.InvariantIgnoreCase字典的构造函数,因为文件名在 Windows 上不区分大小写。这是依赖于平台的——Linux 区分大小写——所以如果你正在创建一个需要健壮和跨平台的共享库,你会想找到一种方法来选择正确的比较器。这个问题会影响所有答案,而不仅仅是我的。

于 2013-09-09T02:49:05.183 回答