2 回答

TA貢獻1784條經驗 獲得超9個贊
您有嵌套循環實現
// O(N) : Loop over IDSIntersections
foreach (var item in IDSIntersections)
{
// O(N) : Again, loop over ae_alignedPartners_olds
var itemOld = ae_alignedPartners_olds.First(p => p.ObjectID == item);
var itemNew = ae_alignedPartners_news.First(p => p.ObjectID == item);
...
在最壞的情況下,您將具有時間復雜性;數十億個循環: .讓我們借助字典擺脫內部循環:O(N) * O(N) = O(N**2)70k * 70k ~ 5e9
// O(N)
var dictOld = ae_alignedPartners_olds
.GroupBy(p => p.ObjectID) // ObjectID should be a int, string or provide good GetHashCode()
.ToDictionary(chunk => chunk.Key,
chunk => chunk.First());
// O(N)
var dictNew = ae_alignedPartners_news
.GroupBy(p => p.ObjectID)
.ToDictionary(chunk => chunk.Key,
chunk => chunk.First());
// O(N)
foreach (var item in IDSIntersections)
{
// O(1) : no loops when finding value by key in dictionary
var itemOld = dictOld[item];
var itemNew = dictNew[item];
...
現在我們將有關于循環:3 * O(N)3 * 70k ~ 2e5

TA貢獻1877條經驗 獲得超6個贊
自定義會很好,但不是因為它提高了性能,它需要做同樣的比較。但是因為在那里封裝邏輯使其更易于維護,可讀和可重用。您可以將其用于許多 LINQ 方法。IEqualityComparer<AE_AlignedPartners>
緩慢的是,您總是在 -循環中搜索舊項和新項。ObjectIdforeach
您不需要選擇兩者的共同點,如果您已經加入了舊的和新的,只需將整個實例存儲在匿名類型中:ObjectID
var intersections = from itemNew in ae_alignedPartners_news
join itemOld in ae_alignedPartners_olds on itemNew.ObjectID equals itemOld.ObjectID
select new { New = itemNew, Old = itemOld };
foreach(var x in intersections)
{
var itemOld = x.Old;
var itemNew = x.New;
// ...
}
- 2 回答
- 0 關注
- 102 瀏覽
添加回答
舉報