我正在使用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;
}
}
}
}
答案 0 :(得分:6)
您可以通过linq填充任何项目,然后将其从列表中删除
List<FileItem> folder = new List<FileItem>();
folder.Remove(folder.SingleOrDefault(x=>x.Name == "myname"));
folder.Remove(folder.SingleOrDefault(x => x.Path == "mypath"));
答案 1 :(得分: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);
}
}
答案 2 :(得分:1)
您可以尝试使用for循环
for(int x = folder.Count() - 1; x>=0; x--)
{
if (folder[x].Name == e.Name)
{
folder.Remove(folder[x]);
}
}
答案 3 :(得分: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<>.Remove
为O(n)。
这也明确强制执行“只有一个同名文件”的合同,因为这是Dictionary<>
的基本属性。
您可能希望将StringComparer.InvariantIgnoreCase
传递给字典的构造函数,因为文件名在Windows上不区分大小写。这是依赖于平台的 - Linux区分大小写 - 因此,如果您要创建一个需要健壮且跨平台的共享库,那么您需要找到一种方法select the correct comparer。此问题影响所有答案,而不仅仅是我的答案。