gpt4 book ai didi

c# - 如何根据 DateTime 值的接近度将两个列表中的所有对象匹配成两个对

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:27:24 24 4
gpt4 key购买 nike

我有两个继承自抽象 AbstractLineModel 类的 RequestsResponses 列表。响应和请求都包含名为 DateTime 的 DateTime(或不包含)、MethodNameGUID

一个 CallPair 包含一对匹配的 Request 和一个 Response:

public class CallPair
{
public AbstractLineModel _request { get; set; }
public AbstractLineModel _response { get; set; }

public CallPair(AbstractLineModel request, AbstractLineModel response)
{
_request = request;
_response = response;
}
}

CallPairOrganizer 类将调用组织到以下列表中:

public class CallPairOrganizer
{
// List of requests and matching responses
private List<CallPair> _callPairs = new List<CallPair>();
private List<AbstractLineModel> _lines = new List<AbstractLineModel>();
private List<AbstractLineModel> _requests = new List<AbstractLineModel>();
private List<AbstractLineModel> _responses = new List<AbstractLineModel>();
private List<AbstractLineModel> _unmatchedRequests = new List<AbstractLineModel>();
private List<AbstractLineModel> _unmatchedResponses = new List<AbstractLineModel>();
}

这是 CallPairOrganizer 类的两个方法:(1) 在较早的 answer 的帮助下,我制作了一个包含 CallPairsList其中与 Response 具有相同 GUIDRequestCallpair 中匹配:

public void MatchCallPairsByRequestId()
{
// Finds request that have matching response based on RequestId and create
// callpair
_callPairs = _requests.Distinct().Where(req => !string.IsNullOrEmpty
(req.RequestId))
.Join(_responses.Distinct(),
req => req.RequestId,
resp => resp.RequestId,
(req, resp) => new CallPair(req, resp)).ToList();

CollectUnmatchedCalls();
}

并且 (2) 我收集所有不匹配的请求和响应如下:

public void CollectUnmatchedCalls()
{
_unmatchedRequests =
_requests.Except(_callPairs.Select(cp => cp._request)).ToList();
_unmatchedResponses = _responses.Except(_callPairs.Select(cp =>
cp._response)).ToList();
}

这行得通。下一步是比较不匹配的请求和响应,并根据 DateTime 属性对它们进行排序如果它们具有相同的 MethodName。如果请求和响应彼此最接近,我想将它们匹配到一个 CallPair 中。

对于这部分,我很难弄清楚要使用哪种算法/linq。我希望有人可以向我提供有关如何完成将请求与相同 MethodName 的响应相匹配的任务的见解,如果它们基于 DateTime 彼此接近的话。

最佳答案

那么,您需要找到“最接近”请求的响应吗?

//just some objects for me to play with
var requests = Enumerable.Range(1).Select(i => new { Time = DateTime.Now, Method = "blah" }).ToList();
var responses = Enumerable.Range(1).Select(i => new { Time = DateTime.Now, Method = "blah" }).ToList();

foreach (var req in requests)
{
//In all of the responses - find the one that happened soonest after the request (with the same method name)
var closestResponse = responses
.Where(resp => resp.Method == req.Method)
.OrderBy(resp => resp.Time - req.Time)
.FirstOrDefault();

//No more responses - exit
if(closestResponse == null)
break;

responses.Remove(closestResponse);

//make new call pair, with the closest rseponse
}

关于c# - 如何根据 DateTime 值的接近度将两个列表中的所有对象匹配成两个对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992148/

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