【发布时间】:2013-01-01 16:51:04
【问题描述】:
给定以下两个字符串:
Dim str1() As String = {"123", "456", "789", "0"}
Dim str2() As String = {"123", "456", "1"}
如何执行 str1 和 str2 的完全外连接并最终得到如下结构:
{Nothing, "1"}
{"0", Nothing}
{"123", "123"}
{"456", "456"}
{"789", Nothing}
基于 SO 和其他网站上的几次讨论,我尝试使用 LINQ:
Dim v = From a In str1 Join b In str2 On a Equals b Group By a Into g = Group
From o In g.DefaultIfEmpty()
但是它并没有产生想要的结果,和这个完全一样(普通的INNER JOIN):
Dim v = From a In str1 Join b In str2 On a Equals b
我看到的最后一个例子是here (C#)。
这里是Another article,但它似乎太复杂了,不可能成为最短的解决方案(我见过更简单的 C# 示例,希望 VB 也能一样高效)。
为什么这个问题有用
例如,可以有一个文件结构,其中文件路径是一个键。通过对键进行完全外连接,您可以比较文件夹,查找哪一侧缺少哪些文件并向用户显示差异。任何类型的同步任务都可以使用这种方法。
【问题讨论】:
-
为什么这个问题可能不适用: 在某些情况下,这两个集合是排序的,例如许多文件系统将按字母顺序返回文件名。在这种情况下,遍历两个列表比较每个列表中的一个元素并在处理过程中处理不匹配比尝试所有可能的配对更有效。
-
@HABO:你说得对,
IO.Directory.GetFiles按字母顺序返回文件。它仍然有用的地方是后处理,例如,您不需要所有文件,只需要预先选择的文件。所以你只会在你感兴趣的 5% 的文件上调用GetFileInfo。无论如何,我认为 LINQ 应该在内部对项目进行排序,然后执行连接,而不管输入如何。如果它不这样做,我会感到惊讶。
标签: c# vb.net linq .net-4.0 outer-join