- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于将其标记为重复的人,请理解我们不想要基于 LINQ 的解决方案。我们的真实示例有数万个范围内的几个原始列表,基于 LINQ 的解决方案的性能不足以满足我们的需求,因为它们必须多次遍历列表才能执行其功能,并随着每个新的源列表进行扩展。
这就是为什么我们专门寻找一种非 LINQ 算法,例如下面这个答案中建议的算法,它们通过枚举器同时遍历所有列表,并且只遍历一次。这似乎是迄今为止最好的,但我想知道是否还有其他的。
现在回到问题...
为了解释我们的问题,考虑这个假设的问题:
我有多个列表,但为了让这个示例简单,我们将其限制为两个,ListA 和 ListB,它们都是 List<int>
类型.他们的数据如下:
List A List B
1 2
2 3
4 4
5 6
6 8
8 9
9 10
...然而真正的列表可能有数万行。
我们接下来有一个名为 ListPairing 的类,其简单定义如下:
public class ListPairing
{
public int? ASide{ get; set; }
public int? BSide{ get; set; }
}
其中每个“边”参数实际上代表列表之一。 (即如果有四个列表,它也会有一个 CSide 和一个 DSide。)
我们正在尝试做的是构造一个List<ListPairing>
数据初始化如下:
A Side B Side
1 -
2 2
- 3
4 4
5 -
6 6
8 8
9 9
- 10
Again, note there is no row with '7'
如您所见,结果看起来像一个完整的外部联接。但是,请参阅下面的更新。
现在开始,我们可以简单地这样做......
var finalList = ListA.Select(valA => new ListPairing(){ ASide = valA} );
哪个产量...
A Side B Side
1 -
2 -
4 -
5 -
6 -
8 -
9 -
现在我们要回填列表 B 中的值。这需要首先检查是否存在与 BSide 匹配的 ASide 的现有 ListPairing,如果是,则设置 BSide。
如果不存在具有匹配 ASide 的现有 ListPairing,则仅使用 BSide 集(ASide 为空)实例化新的 ListPairing。
但是,考虑到所有必需的“FindFirst”调用,我觉得这不是执行此操作的最有效方法。 (这些列表可能有数万个项目。)
但是,预先将这些列表合并会产生以下值...
1, 2, 3, 4, 5, 6, 8, 9, 10 (Note there is no #7)
我的想法是以某种方式使用值的有序并集,然后同时“遍历”两个列表,根据需要构建 ListPairings。这消除了对 FindFirst 的重复调用,但我想知道这是否是最有效的方法。
想法?
人们认为这是使用 LINQ 获取完全外部联接的副本,因为结果是相同的......
我不是在 LINQ 完全外部联接之后。我追求高性能算法。
因此,我更新了问题。
我提出这个问题的原因是执行该功能所需的 LINQ 对于我们的需求来说太慢了。在我们的模型中,实际上有四个列表,每个列表都有几万行。这就是为什么我建议在最后使用 ID 的“联合”方法来获取要遍历的唯一“键”的列表,但我认为发布的关于做同样的事情但使用枚举器的答案是一个更好的方法,因为你不需要预先的 ID 列表。这将产生一次同时通过列表中所有项目的单次传递,这很容易优于基于 LINQ 的方法。
最佳答案
结果并没有我希望的那么整洁,但是如果两个输入列表都已排序,那么您可以一起遍历它们,比较每个列表的头部元素:如果它们相等,那么您就有了一对, 否则自己发出最小的一个并推进该列表。
public static IEnumerable<ListPairing> PairUpLists(IEnumerable<int> sortedAList,
IEnumerable<int> sortedBList)
{
// Should wrap these two in using() per Servy's comment with braces around
// the rest of the method.
var aEnum = sortedAList.GetEnumerator();
var bEnum = sortedBList.GetEnumerator();
bool haveA = aEnum.MoveNext();
bool haveB = bEnum.MoveNext();
while (haveA && haveB)
{
// We still have values left on both lists.
int comparison = aEnum.Current.CompareTo(bEnum.Current);
if (comparison < 0)
{
// The heads of the two remaining sequences do not match and A's is
// lower. Generate a partial pair with the head of A and advance the
// enumerator.
yield return new ListPairing() {ASide = aEnum.Current};
haveA = aEnum.MoveNext();
}
else if (comparison == 0)
{
// The heads of the two sequences match. Generate a pair.
yield return new ListPairing() {
ASide = aEnum.Current,
BSide = bEnum.Current
};
// Advance both enumerators
haveA = aEnum.MoveNext();
haveB = bEnum.MoveNext();
}
else
{
// No match and B is the lowest. Generate a partial pair with B.
yield return new ListPairing() {BSide = bEnum.Current};
// and advance the enumerator
haveB = bEnum.MoveNext();
}
}
if (haveA)
{
// We still have elements on list A but list B is exhausted.
do
{
// Generate a partial pair for all remaining A elements.
yield return new ListPairing() { ASide = aEnum.Current };
} while (aEnum.MoveNext());
}
else if (haveB)
{
// List A is exhausted but we still have elements on list B.
do
{
// Generate a partial pair for all remaining B elements.
yield return new ListPairing() { BSide = bEnum.Current };
} while (bEnum.MoveNext());
}
}
关于c# - 从多个单独列表中匹配项目的 'pair up' 最快的非 LINQ 算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15913683/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!