gpt4 book ai didi

c# - 提高当前 Linq 查询的时间复杂度

转载 作者:太空狗 更新时间:2023-10-30 00:30:17 26 4
gpt4 key购买 nike

我有以下列表:

RakeSnapshots、ProductMovements

目的是对两者进行处理,得到符合条件的元素的个数,如下:

  • 考虑 RakeSnapshotsStatusCode == "Dumping"

  • 考虑 ProductMovementStatus == "InProgress"

  • 获取两个列表中所有元素的 count,满足条件 RakeSnapshots.RakeCode 等于 ProductMovements.ProductCode

以下是我目前的选择:

//代码 1:

 var resultCount =  ProductMovements.Where(x => RakeSnapshots
.Where(r => r.StatusCode == "Dumping")
.Any(y => y.RakeCode == x.ProductCode &&
x.Status == "InProgress"))
.Count();

//代码 2:

var productMovementsInprogress = ProductMovements.Where(x => x.Status == "InProgress");

var rakeSnapShotsDumping = RakeSnapshots.Where(r => r.StatusCode == "Dumping");

var resultCount = productMovementsInprogress.Zip(rakeSnapShotsDumping,(x,y) => (y.RakeCode == x.ProductCode) ? true : false)
.Where(x => x).Count();

挑战是这两个代码都是O(n^2)复杂度,有没有办法改进它,如果数据非常大,这会造成伤害

最佳答案

您可以使用 inner join这样做:

var dumpingRakeSnapshots       = rakeSnapshots.Where(r => r.StatusCode == "Dumping");
var inProgressProductMovements = productMovements.Where(p => p.Status == "InProgress");

var matches =
from r in dumpingRakeSnapshots
join p in inProgressProductMovements on r.RakeCode equals p.ProductCode
select r;

int count = matches.Count(); // Here's the answer.

请注意(正如 Ivan Stoev 指出的那样)这仅在 RakeCode 是 RakeSnapshots 的主键时有效。

如果不是,则必须使用 grouped join .

这是您在这种情况下应该使用的 Linq 查询语法版本,但请注意,这与 Ivan 的回答完全相同(仅在 Linq 查询形式中):

var matches =
from r in dumpingRakeSnapshots
join p in inProgressProductMovements on r.RakeCode equals p.ProductCode into gj
select gj;

为了完整起见,这里有一个可编译的控制台应用程序,它演示了如果 RakeCodeProductCode 不是主键,您将获得的不同结果:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
class RakeSnapshot
{
public string StatusCode;
public string RakeCode;
}

class ProductMovement
{
public string Status;
public string ProductCode;
}

sealed class Program
{
void run()
{
var rakeSnapshots = new List<RakeSnapshot>
{
new RakeSnapshot {StatusCode = "Dumping", RakeCode = "1"},
new RakeSnapshot {StatusCode = "Dumping", RakeCode = "1"},
new RakeSnapshot {StatusCode = "Dumping", RakeCode = "2"}
};

var productMovements = new List<ProductMovement>
{
new ProductMovement {Status = "InProgress", ProductCode = "1"},
new ProductMovement {Status = "InProgress", ProductCode = "2"},
new ProductMovement {Status = "InProgress", ProductCode = "2"}
};

var dumpingRakeSnapshots = rakeSnapshots.Where(r => r.StatusCode == "Dumping");
var inProgressProductMovements = productMovements.Where(p => p.Status == "InProgress");

// Inner join.

var matches1 =
from r in dumpingRakeSnapshots
join p in inProgressProductMovements on r.RakeCode equals p.ProductCode
select r;

Console.WriteLine(matches1.Count());

// Grouped join.

var matches2 =
from r in dumpingRakeSnapshots
join p in inProgressProductMovements on r.RakeCode equals p.ProductCode into gj
select gj;

Console.WriteLine(matches2.Count());

// OP's code.

var resultCount =
productMovements
.Count(x => rakeSnapshots
.Where(r => r.StatusCode == "Dumping")
.Any(y => y.RakeCode == x.ProductCode && x.Status == "InProgress"));

Console.WriteLine(resultCount);
}

static void Main(string[] args)
{
new Program().run();
}
}
}

关于c# - 提高当前 Linq 查询的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39117516/

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