使用 LINQ 删除重复记录
Remove duplicate records using LINQ
我想使用 linq to object 来删除重复的记录。
我希望最终列表将包含具有最新日期的唯一记录。
我有以下列表
AId BId C(date)
**1 2 24/5/2015**
3 6 24/5/2015
**1 2 23/5/2015** (Need To Remove)
我想删除记录 3。
有什么建议吗?
先找出重复值再删除
var DuplicateList = lst.GroupBy(x=>x)
.Where(g=>g.Count()>1)
.Select(y=>y)
.ToList();
然后在您的列表上循环并删除每个重复项中的一个
for (int i = OriginalList.Count - 1; i >= 0; i--)
{
if(DuplicateList.Exists(x=>x.BId == OriginalList[i].BId)
OriginalList.RemoveAt(i)
}
备注
如果您的列表是 IEnumerable
,则可以在条件中使用 Any
而不是 Exists
所以条件将是
if(DuplicateList.Any(x=>x.BId == OriginalList[i].BId)
OriginalList.RemoveAt(i)
使用GroupBy:
var unique1 = table1.AsEnumerable()
.GroupBy(x=>x.Field<string>("AId"))
.Select(g=>g.First());
然后如果你遍历 unique1 就会有一行 "AId" **1
在这里,我们专门用 "AId 进行分组,因为在重复的行中 dates
不同
您可以使用 GroupBy
然后 Select
和 OrderByDescending
来排序日期。
public class Item
{
public int Aid {get;set;}
public int Bid {get;set;}
public DateTime CDate {get;set;}
}
void Main()
{
var items = new List<Item>
{
new Item { Aid = 1, Bid = 2, CDate = new DateTime(2015, 5, 24)},
new Item { Aid = 3, Bid = 6, CDate = new DateTime(2015, 5, 24)},
new Item { Aid = 1, Bid = 2, CDate = new DateTime(2015, 5, 23)},
};
var result = items.GroupBy(i => i.Aid)
.Select(group =>
new { Key = group.Key,
Items = group.OrderByDescending(x => x.CDate) })
.Select (g => g.Items.First());
result.Dump();
}
按 Aid
和 Bid
列分组,每组 select 项具有最新的 C
列日期:
var result = myTable.GroupBy(item => new {item.Aid, item.Bid})
.Select(group => group.OrderByDescending(item => item.C).First());
我想使用 linq to object 来删除重复的记录。 我希望最终列表将包含具有最新日期的唯一记录。 我有以下列表
AId BId C(date)
**1 2 24/5/2015**
3 6 24/5/2015
**1 2 23/5/2015** (Need To Remove)
我想删除记录 3。
有什么建议吗?
先找出重复值再删除
var DuplicateList = lst.GroupBy(x=>x)
.Where(g=>g.Count()>1)
.Select(y=>y)
.ToList();
然后在您的列表上循环并删除每个重复项中的一个
for (int i = OriginalList.Count - 1; i >= 0; i--)
{
if(DuplicateList.Exists(x=>x.BId == OriginalList[i].BId)
OriginalList.RemoveAt(i)
}
备注
如果您的列表是 IEnumerable
Any
而不是 Exists
所以条件将是
if(DuplicateList.Any(x=>x.BId == OriginalList[i].BId)
OriginalList.RemoveAt(i)
使用GroupBy:
var unique1 = table1.AsEnumerable()
.GroupBy(x=>x.Field<string>("AId"))
.Select(g=>g.First());
然后如果你遍历 unique1 就会有一行 "AId" **1
在这里,我们专门用 "AId 进行分组,因为在重复的行中 dates
不同
您可以使用 GroupBy
然后 Select
和 OrderByDescending
来排序日期。
public class Item
{
public int Aid {get;set;}
public int Bid {get;set;}
public DateTime CDate {get;set;}
}
void Main()
{
var items = new List<Item>
{
new Item { Aid = 1, Bid = 2, CDate = new DateTime(2015, 5, 24)},
new Item { Aid = 3, Bid = 6, CDate = new DateTime(2015, 5, 24)},
new Item { Aid = 1, Bid = 2, CDate = new DateTime(2015, 5, 23)},
};
var result = items.GroupBy(i => i.Aid)
.Select(group =>
new { Key = group.Key,
Items = group.OrderByDescending(x => x.CDate) })
.Select (g => g.Items.First());
result.Dump();
}
按 Aid
和 Bid
列分组,每组 select 项具有最新的 C
列日期:
var result = myTable.GroupBy(item => new {item.Aid, item.Bid})
.Select(group => group.OrderByDescending(item => item.C).First());