比较大清单

时间:2019-04-03 11:59:39

标签: c#

我有两个非常大的列表,每个列表有几十万个项目,一个完整,另一个没有丢失的项目。我需要知道不完整列表中缺少哪些项目。我已经尝试过使用<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>,但是要花很多时间才能完全比较它们。

2 个答案:

答案 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)));
}

由于您的数据已经排序,因此有更多的单途径解决问题的方法。让我知道这是否对您有用,因为我没有测试床可以对此进行测试。