【问题标题】:LINQ expression to compare nested arrays用于比较嵌套数组的 LINQ 表达式
【发布时间】:2018-05-21 08:56:19
【问题描述】:

我有一个行列表,一行由一组 LatLngs(纬度/经度)组成,因此,这就是列表的表示方式。

IEnumerable<LatLng[]> lineNetwork;

我正在尝试计算返回lineNetwork 中连接到givenLine 的所有行所需的LINQ 表达式。要连接它们,它们的纬度和经度必须等于 givenLine 中的纬度和经度。

LatLng[] givenLine = 
{ 
    new LatLng(Latitude: 0.1, Longitude: 0.1),
    new LatLng(Latitude: 0.2, Longitude: 0.2),
    new LatLng(Latitude: 0.3, Longitude: 0.3)
}

IEnumerable<LatLng[]> connectedLines = lineNetwork.LINQEXPRESSIONRETURNSCONNECTEDLINES(givenLine);

【问题讨论】:

    标签: c# arrays linq ienumerable


    【解决方案1】:

    您可能应该为 LatLng 类型定义相等,我假设它是一个结构。

    您的查询将类似于

    var connectedLines = lineNetwork.Where( line => line.Any( coord => givenLine.Contains( coord ) ) );
    

    在这里,我假设给定正确的相等实现 Contains() 将返回 true。

    【讨论】:

    • 如果LatLng 重载了Equals... 否则你将不得不使用第二个.Any() 而不是Contains
    • 可以简化为line.Any(givenLine.Contains)
    • @xanatos 同意。
    • 除了答案,谁能告诉我在“givenLine”实际上是一个givenLines列表的情况下它会如何改变,即IEnumerable givenLines?还是我应该为此创建一个新线程?
    【解决方案2】:

    假设LatLng 是平等的,您可以使用Intersect

    var result = lineNetwork.Where (n => n.Intersect(givenLine).Any())
    

    由于Intersect 在内部使用哈希表进行查找,它会产生非常好的性能。

    【讨论】:

    • 除了答案,谁能告诉我在“givenLine”实际上是一个givenLines列表的情况下它会如何改变,即IEnumerable givenLines?还是我应该为此创建一个新线程?
    • 将表达式中的 givenLine 更改为 givenLines.SelectMany(x =&gt; x)
    • Since Intersect use a hashtable for lookup internally it will yield very good performance. 不幸的是,这样做的代价是创建M 哈希表——其中MlineNetwork.Count()。因此,一个可能性能更好的解决方案(但它取决于lineNetwork 的大小和givenLine 的大小)是相反的。从givenLine(一次)生成bobHashSet,然后使用lineNetwork.Where (n =&gt; n.Any(z =&gt; bob.Contains(z)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    相关资源
    最近更新 更多