我用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多条记录。
答案 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
,因此Login
和Logout
字段的日期部分将相同。
手持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();