使用较低的TIME值从ListView中删除重复值?

时间:2014-02-28 14:53:00

标签: c# .net listview duplicates listviewitem

我有一个listview控件,它填充了SQL语句中返回的记录。字段可能类似于:

SSN------|NAME|DATE----|TIME--|SYS
111222333|Bell|20140130|121507|P
123456789|John|20140225|135000|P
123456789|John|20140225|135002|N

“重复”是从ChangeLog生成的,例如更改地址。由于数据库设计不好,我无法控制,如果成员恰好是SYS的成员,则地址更改将创建2条记录。

在列表视图中查看每条记录的最佳方法是,找到SSN&的重复值DATE(如果人是两者的成员,则可以为SYS生成记录),并删除值TIME较低的重复值?

我正在尝试使用基于代码的解决方案而不是SQL,因为真正的SQL语句已经非常复杂,并且此应用程序只需要维护到10月。

1 个答案:

答案 0 :(得分:1)

为此,我假设您有一些类,这些记录的属性通过SSNTime等轻松访问公开,我还假设它们都是字符串。在下面的代码中,我将此对象称为Record

提示:您可能希望删除SYS标记设置为False的项目,而不是按时判断(可能没有区别)。

我没有故意使用任何lambda乐趣来试图保持这个简单易读。

每次将项目加载到ListView时调用此代码....在将该列表加载到ListView之前清理该列表实际上更好一点,但下面的代码是根据可用信息解决您的问题。

//Turn the ListView's ItemCollection into an easy to use List<Record>
List<Record> records = myListView.Items.OfType<Record>().ToList();

//Grab records with duplicate SSNs but with lower Time values 
List<Record> recordsToRemove = new List<Record>();
foreach (var record in records)
{
    foreach (var r in records)
    {
        if (record.SSN == r.SSN && record != r)
        {
            if (int.Parse(r.Time) > int.Parse(record.Time))
                recordsToRemove.Add(record);
            else
                recordsToRemove.Add(r);
        }
    }
}

//Now actually remove the items from the ListView
foreach (var record in recordsToRemove)
{
    myListView.Items.Remove(record);
}