我有两个非常大的列表,每个列表有几十万个项目,一个完整,另一个没有丢失的项目。我需要知道不完整列表中缺少哪些项目。我已经尝试过使用<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<template>
<b-row>
<b-col cols="12" xl="6">
<transition name="slide">
<b-card :header="caption">
<b-table :hover="hover" :striped="striped" :bordered="bordered" :small="small" :fixed="fixed" responsive="sm" :items="items" :fields="fields" :current-page="currentPage" :per-page="perPage" @row-clicked="rowClicked">
<template slot="id" slot-scope="data">
<strong>{{data.item.id}}</strong>
</template>
<template slot="name" slot-scope="data">
<strong>{{data.item.name}}</strong>
</template>
<template slot="status" slot-scope="data">
<b-badge :variant="getBadge(data.item.status)">{{data.item.status}}</b-badge>
</template>
</b-table>
<nav>
<b-pagination size="sm" :total-rows="5" :per-page="perPage" v-model="currentPage" :prev-text="$t('previous')" :next-text="$t('next')" hide-goto-end-buttons/>
</nav>
</b-card>
</transition>
</b-col>
</b-row>
</template>
,但是要花很多时间才能完全比较它们。
答案 0 :(得分:1)
Enumerable.Except
但是{{1}}中大致使用了相同的机制,因此我认为它不会提高性能。您在发布或调试配置中进行编译了吗?
答案 1 :(得分:1)
根据您提供的信息,我认为通过比较之前将字符串转换为整数类型,您应该能够获得良好的性能优势。
我已经编写了该实现的LINQ和非LINQ版本。主要区别在于.ToDictionary
调用会稍慢一些,因为重新分配了较大的内存插槽。在非LINQ版本中,我们可以使用HashSet
,但是我使用的版本(4.6.1
)不允许我通过指定容量来构造。
// Sample String POS0001:615155172
static long GetKey(string s) => long.Parse("1" + s.Substring(3, 4) + s.Substring(8));
static IEnumerable<string> FindMissing(IEnumerable<string> masterList, ICollection<string> missingList) {
var missingSet = new Dictionary<long, bool>(missingList.Count);
foreach (string s in missingList)
missingSet.Add(GetKey(s), true);
// Compact LINQ Way, but potentially, ineffecient
//var missingSet = missingList.ToDictionary(GetKey, s => true);
return masterList.Where(s => !missingSet.ContainsKey(GetKey(s)));
}
由于您的数据已经排序,因此有更多的单途径解决问题的方法。让我知道这是否对您有用,因为我没有测试床可以对此进行测试。