C#:从List <t>中删除一个项而不知道它的索引?</t>

时间:2013-09-09 01:39:28

标签: c# list

我正在使用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 个答案:

答案 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。此问题影响所有答案,而不仅仅是我的答案。