0

各位早安。

使用 C sharp .net4 和 MS Visual Studio 2010。

我为我的 Windows 窗体程序开发了一个重复检查器。当有几百条记录时,它完美地工作并且在我的 Datagrid 上几乎是即时的。

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

如果有人有一些好的技巧可以让这种方法更快地改进现有设计,或者我已经看过的不同方法,我正在徘徊。

再次非常感谢您的帮助!

这是代码:

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();     
}

任何问题让我知道,我会尽力回答。

4

2 回答 2

1

有一种方法可以提高效率。您需要计算每个项目的哈希值。具有不同哈希的项目不可能重复。

一旦你有了散列,你可以按散列排序或使用具有高效键检索的数据结构(如Dictionary<TKey,TValue>)来查找所有重复项。

于 2012-06-26T08:42:19.743 回答
1

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

我认为这里问题的很大一部分是按名称重复取消引用单元格,以及您重复尊重第二组单元格的事实。所以提前做这一切:

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.
于 2012-06-26T08:58:03.687 回答