在数组列表中查找重复项

时间:2017-03-21 15:57:48

标签: c# arrays

我用List<string[]>来保存从excel电话记录中导入的记录。数组的结构是

[person][date][login][logout]

由于电话系统已经过时,它会偶尔丢弃所有人并迫使他们再次登录,因此1天内有2条记录,如果手机出现糟糕的一天可能更多。

例如:

第一条记录:

[Chris Iverson][03/21/2017][08:01:02][10:14:27]  

第二条记录:

[Chris Iverson][03/21/2017][10:17:03][18:00:06]

在上面的示例中,我有2条记录,代表我必须登录手机的2次。下面是这个例子,我希望首次登录08:01:02,最后一次登出18:00:06,然后将其放入1条记录中,结构如下:

 [Chris Iverson][03/21/2017][08:01:02][18:00:06]   

根据当天,我可能需要为我们小组中的每个人处理3个或更多条目,这可能很容易变成300多条记录。

3 个答案:

答案 0 :(得分:2)

字符串数组完全不适合数据操作。首先将它们转换为包含具有相同数据的命名字段的对象:

class LoginRecord {
    public string Person {get;}
    public DateTime Login {get;}
    public DateTime Logout {get;}
    public LoginRecord(string person, string date, string login, string logout) {
        ... // Parse strings to make fields of appropriate types
    }
    public LoginRecord(string person, DateTime login, DateTime logout) {
        if (login.Date != logout.Date) {
            throw new ArgumentException(nameof(logout));
        }
        Person = person;
        Login = login;
        Logout = logout;
    }
}

构造函数只需一个date,因此LoginLogout字段的日期部分将相同。

手持List<LoginRecord>,即可:

var combined = list
    .GroupBy(r => new {r.Person, Date = r.Login.Date})
    .Select(g =>
        new LoginRecord(
            g.Key.Person
        ,   g.Select(r => r.Login).Min()
        ,   g.Select(r => r.Logout).Max()
        )
    ).ToList();

答案 1 :(得分:0)

使用Hashtable,在添加检查密钥是否已存在之前,将字符串项添加为键。

答案 2 :(得分:0)

假设以下数组元素结构

[0] = person
[1] = date
[2] = login (time)
[3] = logout (time)

你可以做这样的事情

var filtered_records = records.Where(r => r[0] == "person name" && r[1] == "date to check");
var first_login = filtered_records.Select(f => f[3]).OrderBy(o => TimeSpan.Parse(o)).FirstOrDefault();
var last_logout = filtered_records.Select(f => f[4]).OrderByDescending(o => TimeSpan.Parse(o)).FirstOrDefault();