使用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();
}
任何问题让我知道,我会尽力回答。
答案 0 :(得分:1)
有一种方法可以提高效率。您需要计算每个项目的哈希。具有不同散列的项目不可能是重复的。
一旦你有哈希值,你可以通过哈希排序或使用具有有效键控检索的数据结构(如Dictionary<TKey,TValue>
)来查找所有重复项。
答案 1 :(得分: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.