首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一种改进查重方法

一种改进查重方法
EN

Stack Overflow用户
提问于 2012-06-26 16:38:18
回答 2查看 298关注 0票数 0

早上好伙计们。

使用Visual .net4和MS Visual Studio2010。

我已经为我的windows表单程序开发了一个重复检查程序。当有几百条记录时,它可以完美地工作,并且在我的Datagrid上几乎是即时的。

我注意到的问题是,当有6000条记录显示时,效率根本不够,而且需要几分钟的时间。

我在想,有没有人有一些好的技巧来让这个方法更快,要么是在现有设计的基础上改进,要么是我忽略的一个不同的方法。

再次感谢您的帮助!

代码如下:

代码语言:javascript
运行
复制
public void CheckForDuplicate()
{
    DataGridViewRowCollection coll = ParetoGrid.Rows;
    DataGridViewRowCollection colls = ParetoGrid.Rows;
    IList<String> listParts = new List<String>();
    int count = 0;

    foreach (DataGridViewRow item in coll)
    {
        foreach (DataGridViewRow items in colls)
        {
            count++;
            if ((items.Cells["NewPareto"].Value != null) && (items.Cells["NewPareto"].Value != DBNull.Value))
            {
                if ((items.Cells["NewPareto"].Value != DBNull.Value) && (items.Cells["NewPareto"].Value != null) && (items.Cells["NewPareto"].Value.Equals(item.Cells["NewPareto"].Value)))
                {
                    if ((items.Cells["Part"].Value != DBNull.Value) && (items.Cells["Part"].Value != null) && !(items.Cells["Part"].Value.Equals(item.Cells["Part"].Value)))
                    {
                        listParts.Add(items.Cells["Part"].Value.ToString());

                        dupi = true; //boolean toggle
                    }
                }
            }
        }
    }  
    MyErrorGrid.DataSource = listParts.Select(x => new { Part = x }).ToList();     
}

任何问题请让我知道,我会尽我最大的努力回答他们。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-26 16:58:04

如果可以,您应该尝试在底层数据而不是UI对象上执行此操作-然而,我有一种预感,您是从一组DataRows中播种的,在这种情况下,您可能无法做到这一点。

我认为这里的问题很大一部分是重复取消对单元格名称的引用,以及重复引用第二组单元格的事实。因此,所有这些都要提前完成:

代码语言:javascript
运行
复制
var first = (from row in coll.Cast<DataGridViewRow>()
            let newpareto = row.Cells["NewPareto"].Value ?? DBNull.Value
            let part = row.Cells["Part"].Value ?? DBNull.Value
            where newpareto != DBNull.Value && part != DBNull.Value
            select new 
            { newpareto = newpareto, part = part }).ToArray();

//identical - so a copy-paste job (if not using anonymous type we could refactor)
var second = (from row in colls.Cast<DataGridViewRow>()
            let newpareto = row.Cells["NewPareto"].Value ?? DBNull.Value
            let part = row.Cells["Part"].Value ?? DBNull.Value
            where newpareto != DBNull.Value && part != DBNull.Value
            select new 
            { newpareto = newpareto, part = part }).ToArray();


//now produce our list of strings
var listParts = (from f in first
                where second.Any(v => v.newpareto.Equals(f.newpareto)
                                   && !v.part.Equals(f.part))
                select f.part.ToString()).ToList(); //if you want it as a list.
票数 1
EN

Stack Overflow用户

发布于 2012-06-26 16:42:20

有一种方法可以让这一切变得更有效率。你需要计算每一项的哈希值。具有不同散列的项不可能是重复的。

获得散列后,您可以按散列进行排序,也可以使用具有高效键值检索的数据结构(如Dictionary<TKey,TValue>)来查找所有重复项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11203577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档