我有两个列表Requests
和Responses
谁从抽象继承AbstractLineModel
类。无论是响应和请求包含一个名为日期时间(或没有)DateTime
,MethodName
和一个GUID
。
甲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)具有较早的帮助下回答我已经做了List
的CallPairs
,其中Request
与同GUID
为Response
中匹配Callpair
:
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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句