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

欧文(Erwin Rooijakkers)

我有两个列表RequestsResponses谁从抽象继承AbstractLineModel类。无论是响应和请求包含一个名为日期时间(或没有)DateTimeMethodName和一个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)具有较早的帮助下回答我已经做了ListCallPairs,其中Request与同GUIDResponse中匹配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彼此接近。

戴夫·比斯(Dave Bish)

因此,您需要找到对请求的“最接近”响应?

//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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在两个对象上均具有匹配项的筛选流将一个对象的值设置为另一对象的值

如何将两个SQL表中的所有值相乘和求和

如何将两个列表中的所有值相乘并获得相应的矩阵

Matlab-创建两个考虑两个对象所有可能值的数组

LINQ查询以将一个对象的两个值与一个列表进行比较,其中两个对象必须匹配

如何在Python中的两个列表中匹配最接近的数组?

根据Python中的匹配列表连接两个矩阵?

基于接近度的两个向量的匹配元素

如何将具有两个单独对象的数组列表生成的表列中的所有值相加?

如何匹配两个逗号之间的所有内容?

如何根据ID合并两个对象列表?

根据数组列表中的两个参数删除对象

如何从两个单独的数组中创建具有两个键/值对的对象

如何将.txt中的两个值分隔为两个不同的文件?

如何计算JavaScript中两个列表的相似度

如何将两个列表中具有相同键的字典值相加?

根据两个不同列中的匹配值连接两个以空格分隔的文件

返回与两个条件匹配的所有值的列表

如何根据与两个不同列相关的两个条件打印所有行?

如何根据列表中的两个不同值获得 2 个计数并检查两个计数是否相等?

如何根据键匹配值将两个对象数组合并为一个数组

如何将两个日期之间的所有分钟添加到列表中

根据列中的值匹配两个 Pandas DataFrame

在两个二维数组中查找所有接近的数字匹配

如何匹配两个列表并插入特定值?

如何从具有 2 个级别的 json 中搜索值作为来自两个对象的返回匹配项?

如何使用 isinstance() 根据对象的类型将列表分成两个列表?

如何依赖匹配具有两个元素的列表?

如何根据属性减去两个对象列表?