[英]C# How to filter a list and remove duplicates?
我有一个类型X的列表。这包含字段,我需要从列表中只返回唯一的记录。 我需要使用包含时间戳的字段/属性(OIndex)之一并使用该属性对其进行过滤。 列表是这样的:
> 2c55-Checked-branchDeb-20160501121315-05
> 2c60-Checked-branchDeb-20160506121315-06
> 2c55-Checked-branchDeb-20160601121315-07
> 2c55-Checked-branchDeb-20160601141315-07
> 2c60-Checked-branchDeb-20160720121315-08
在上面的示例中,最后一个字段是recordId,因此我们有一个重复的记录“07”。 时间戳是第四场。 所以我想获得所有记录,除了第3个是重复的。 记录“07”的最新版本是第四行。
我开始做代码但很挣扎。 至今:
List<X> originalRecords = GetSomeMethod(); //this method returns our list above
var duplicateKeys = originalRecords.GroupBy(x => x.Record) //x.Record is the record as shown above "05", "06" etc
.Where(g => g.Count() > 1)
.Select(y => y.Key);
现在我该怎么做? 现在我有了重复的密钥。 我想我需要再次查看OriginalRecords列表,看看它是否包含重复键。 然后在datetime上使用substring。 将其存储在某处,然后删除不是最新的记录。 并使用过滤器保存原始记录。 谢谢
您不需要明确地找到重复的键,您只需从每个组中选择第一个:
var res == originalRecords
.GroupBy(x => x.RecordId)
.Select(g => g.OrderByDescending(x => x.DateTimeField).First());
在代码中没有datetimefield的字段。 我只是有一个字符串字段,其中包含日期时间和其他数据。 但是该记录有一个Record Id字段。
您可以在短划线上拆分记录,获取日期时间部分,然后对其进行排序。 您的日期/时间采用允许按字典顺序排序的格式,因此您可以跳过解析日期。
假设没有破折号,并且所有字符串都以相同的方式格式化, x.TextString.Split('-')[3]
表达式将为您提供记录的时间戳部分:
var res == originalRecords
.GroupBy(x => x.RecordId)
.Select(g => g.OrderByDescending(x => x.TextString.Split('-')[3]).First());
这应该可以解决您的问题:
List<X> originalRecords = GetSomeMethod();
Dictionary<int, X> records = new Dictionary<int, X>();
foreach (X record in originalRecords) {
if(records[record.recordId] != null) {
if(records[record.recordId].stamp < record.stamp){
records[record.recordId] = record;
}
}
else {
records[record.recordId] = record;
}
}
你的答案是记录。价值
希望能帮助到你
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.