如何使用linq删除重复记录

本文关键字:记录 删除 何使用 linq | 更新日期: 2023-09-27 18:06:17

我有一个列表的列表,想从列表中删除重复项。数据以列表格式存储,例如IEnumerable<IEnumerable<string>> tableData如果我们将其视为表值,父列表用于行,子列表用于每列的值。现在我想删除所有重复的行。下表中的值A是重复的。

List<List<string>> ls = new List<List<string>>();
ls.Add(new List<string>() { "1", "A" });
ls.Add(new List<string>() { "2", "B" });
ls.Add(new List<string>() { "3", "C" });
ls.Add(new List<string>() { "4", "A" });
ls.Add(new List<string>() { "5", "A" });
ls.Add(new List<string>() { "6", "D" });
IEnumerable<IEnumerable<string>> tableData = ls;
var abc = tableData.SelectMany(p => p).Distinct();   ///not work

操作后,我希望abc应该是tableData格式的

ls.Add(new List<string>() { "1", "A" });
ls.Add(new List<string>() { "2", "B" });
ls.Add(new List<string>() { "3", "C" });   
ls.Add(new List<string>() { "6", "D" });

如何使用linq删除重复记录

tableData.GroupBy(q => q.Skip(1).First()).Select(q => q.First())

您可以在IEqualityComparer中使用Distinct传递的重载,假设您实际上有一个IEnumerable<IEnumerable<PropertyData>>

例如:

var items = tableData.SelectMany(x => x).Distinct(new TableComparer());

对比者:

public class TableComparer : IEqualityComparer<PropertyData>
{
    public bool Equals(PropertyData x, PropertyData y)
    {
        return x.id == y.id;
    }
    public int GetHashCode(PropertyData pData)
    {
        return pData.id.GetHashCode();
    }
}

如果它只是一个IEnumerable<IEnumerable<string>>,您可以在没有过载的情况下使用Distinct()

var items = tableData.SelectMany(x => x).Distinct();

尽管你的问题不清楚。。

var distinctValues = tableData.SelectMany(x => x).Distinct();

这将使列表变平,并选择不同的字符串集。

您可以使用下面的代码

         List<List<string>> ls=new List<List<string>>();
         ls.Add(new List<string>(){"Hello"});
         ls.Add(new List<string>(){"Hello"});
         ls.Add(new List<string>() { "He" });
         IEnumerable<IEnumerable<string>> tableData = ls;
         var abc = tableData.SelectMany(p => p).Distinct();

O/p是

你好