使用LINQ删除重复记录

时间:2015-05-24 07:36:55

标签: c# asp.net linq linq-to-entities

我想使用linq来反对删除重复的记录。 我希望最终列表包含具有最新日期的唯一记录。 我有以下列表

AId             BId           C(date)
**1              2               24/5/2015**
3                6               24/5/2015
**1              2               23/5/2015** (Need To Remove)

我想删除记录3。

任何建议?

4 个答案:

答案 0 :(得分:1)

您可以使用GroupBy,然后SelectOrderByDescending一起订购日期。

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();
}

答案 1 :(得分:1)

AidBid列分组,并从每个组中选择包含最新C列日期的项目:

var result =  myTable.GroupBy(item => new {item.Aid, item.Bid})
                     .Select(group => group.OrderByDescending(item => item.C).First());

答案 2 :(得分:0)

首先找到重复的值,然后删除它们

  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)
  }

请注意 如果您的列表为Any

,则可以在条件中使用Exists代替IEnumerable

所以条件将是

   if(DuplicateList.Any(x=>x.BId == OriginalList[i].BId)
            OriginalList.RemoveAt(i)

答案 3 :(得分:0)

使用GroupBy:

var unique1 = table1.AsEnumerable()
                       .GroupBy(x=>x.Field<string>("AId"))
                       .Select(g=>g.First());

然后如果你循环通过unique1,那么将有一行带有“AId”** 1 这里我们专门用“AId”进行分组,因为在你的重复行中dates是不同的