首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据键字段列表删除数据表的重复行

根据键字段列表删除数据表的重复行
EN

Stack Overflow用户
提问于 2015-08-13 07:30:25
回答 1查看 1.2K关注 0票数 1

我使用以下代码删除DataTable中基于一个字段(keyField)值的重复行

代码语言:javascript
运行
复制
IEnumerable<DataRow> uniqueContacts = dt.AsEnumerable()
                    .GroupBy(x =>  x[keyField].ToString())
                    .Select(g => g.First());
DataTable dtOut = uniqueContacts.CopyToDataTable();

如何升级此代码,以便LINQ根据字段列表的值删除重复项。例如,删除所有具有相同“名字”和“姓氏”的行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-13 07:35:25

您可以使用匿名类型:

代码语言:javascript
运行
复制
IEnumerable<DataRow> uniqueContacts = dt.AsEnumerable()
                    .GroupBy(row =>  new { 
                        FirstName = row.Field<string>("FirstName"),
                        LastName  = row.Field<string>("LastName")
                    })
                    .Select(g => g.First());

由于您想要一个使用编译时未知的List<string>的解决方案,所以可以使用这个类:

代码语言:javascript
运行
复制
public class MultiFieldComparer : IEquatable<IEnumerable<object>>, IEqualityComparer<IEnumerable<object>>
{
    private IEnumerable<object> objects;

    public MultiFieldComparer(IEnumerable<object> objects)
    {
        this.objects = objects;
    }

    public bool Equals(IEnumerable<object> x, IEnumerable<object> y)
    {
        return x.SequenceEqual(y);
    }

    public int GetHashCode(IEnumerable<object> objects)
    {
        unchecked
        {
            int hash = 17;
            foreach (object obj in objects)
                hash = hash * 23 + (obj == null ? 0 : obj.GetHashCode());
            return hash;
        }
    }

    public override int GetHashCode()
    {
        return GetHashCode(this.objects);
    }

    public override bool Equals(object obj)
    {
        MultiFieldComparer other = obj as MultiFieldComparer;
        if (other == null) return false;
        return this.Equals(this.objects, other.objects);
    }

    public bool Equals(IEnumerable<object> other)
    {
        return this.Equals(this.objects, other);
    }
}

这个扩展方法使用这个类:

代码语言:javascript
运行
复制
public static IEnumerable<DataRow> RemoveDuplicates(this IEnumerable<DataRow> rows, IEnumerable<string> fields)
{
    return rows
        .GroupBy(row => new MultiFieldComparer(fields.Select(f => row[f])))
        .Select(g => g.First());
}

然后它很简单,因为:

代码语言:javascript
运行
复制
List<string> columns = new List<string> { "FirstName", "LastName" };
var uniqueContacts = dt.AsEnumerable().RemoveDuplicates(columns).CopyToDataTable();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31982111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档