gpt4 book ai didi

c# - 大列表函数超时(C# 中的 LINQ 查询)

转载 作者:太空狗 更新时间:2023-10-29 21:51:47 24 4
gpt4 key购买 nike

我正在使用以下查询

var queryList1Only = (from file in list1
select file).Except(list2, myFileCompare);

myFileCompare 根据名称和长度对 2 个文件进行比较。

如果 list1 和 list2 很小(比如我测试时有 100 个文件),查询返回结果,然后我将 list1 增加到 30,000 个文件,将 list2 增加到 20,000 个文件,查询现在显示 "Function Evaluation Timed出”

我在网上搜索,发现调试可能导致它,所以我删除了所有断点并运行代码,现在程序卡住了,没有任何输出 queryList1Only 我正在尝试打印出来检查

编辑:这是 myFileCompare 的代码

class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{

public FileCompare() { }

public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2)
{
return (f1.Name == f2.Name && f1.Directory.Name == f2.Directory.Name &&
f1.Length == f2.Length);
}

// Return a hash that reflects the comparison criteria. According to the
// rules for IEqualityComparer<T>, if Equals is true, then the hash codes must
// also be equal. Because equality as defined here is a simple value equality, not
// reference identity, it is possible that two or more objects will produce the same
// hash code.
public int GetHashCode(System.IO.FileInfo fi)
{
string s = String.Format("{0}{1}", fi.Name, fi.Length);
return s.GetHashCode();
}

}

最佳答案

您需要对查询返回的项目做什么?基本上,如此繁重的操作最好在单独的线程中同时执行,以避免您刚刚遇到的情况。

编辑:一个想法

作为案例,您可以尝试以下算法:

  • 使用 QuickSort 对两个数组中的项目进行排序( List<T>.Sort() uses it by default ), 如果很好地执行 GetHashCode() 会很快
  • 然后在众所周知的for()循环遍历列表,比较索引相同的元素
  • 当任何数组的计数达到另一个列表的最大索引时 - 从后一个列表中选择所有项目作为不同的(基本上它们根本不存在于前一个列表中)。

我相信使用排序数组可以提供更好的性能。我相信 Except() 的复杂度是 O(m*n)

编辑:另一个想法,应该非常快

  • 从一台服务器存储项目 Set<T>
  • 然后遍历第二个数组并在 Set<T> 中搜索,它会非常快!基本上 O(mlogm) + O(n) 因为你只需要遍历单个数组并在具有良好哈希函数的集合中搜索(使用 GetHashCode() 我提供了更新的逻辑)非常快的。试试吧!
// some kind of C# pseudocode ;)
public IEnumerable<FileInfo> GetDifference()
{
ISet<FileInfo> firstServerFilesMap = new HashSet<FileInfo>();

// adding items to set
firstServerFilesMap.Add();

List<FileInfo> secondServerFiles = new List<FileInfo>();

// adding items to list
firstServerFilesMap.Add();

foreach (var secondServerFile in secondServerFiles)
{
if (!firstServerFilesMap.Contains(secondServerFile))
{
yield return secondServerFile;
}
}
}

编辑:评论中提供了有关相等逻辑的更多详细信息

试试这个实现

public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2)
{
if ( f1 == null || f2 == null)
{
return false;
}

return (f1.Name == f2.Name && f1.Directory.Name == f2.Directory.Name &&
f1.Length == f2.Length);
}

public int GetHashCode(System.IO.FileInfo fi)
{
unchecked
{
int hash = 17;
hash = hash * 23 + fi.Name.GetHashCode();
hash = hash * 23 + fi.Directory.Name.GetHashCode();
hash = hash * 23 + fi.Length.GetHashCode();

return hash;
}
}

有用的链接:

关于c# - 大列表函数超时(C# 中的 LINQ 查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7098104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com