c# - 在 C# 中使用 LINQ 减少字典中的重复项

标签 c# linq dictionary

我正在尝试使用 LINQ 从现有字典创建一个新字典,并在此过程中删除重复项。

现有词典如下:

Dictionary<LoaderConfig, List<ColumnInfo>> InvalidColumns = new Dictionary<LoaderConfig, List<ColumnInfo>>();

public struct LoaderConfig
{
    public string ObjectName { get; set; }
    public DateTime? LoadDate { get; set; }
    public string Load { get; set; }
    public string TableName { get; set; }
}

public struct ColumnInfo
{
    public string ColumnName { get; set; }
    public string DataType { get; set; }
    public int DataLength { get; set; }
}

我最终想要的是 Dictionary<string, List<ColumnInfo>>其中键是 LoaderConfig 对象的 TableName 属性,并且每个 TableName 的 ColumnInfo 对象列表都是唯一的。

我是根据我发现的另一篇文章开始的:

var alterations = InvalidColumns
    .GroupBy(pair => pair.Key.TableName)
    .Select(group => group.First())
    .ToDictionary(pair => pair.Key.TableName, pair => pair.Value);

由于 First(),这不起作用。我想有一种方法可以使用 LINQ 扩展来实现此目的,我只需要一些帮助来找到它。

谢谢!

最佳答案

我个人会做这样的事情:

首先为ColumnInfo创建一个IEqualityComparer(由Distinct使用)

    public struct ColumnInfo
    {
        public string ColumnName { get; set; }
        public string DataType { get; set; }
        public int DataLength { get; set; }

        public class ColumnNameComparer : IEqualityComparer<ColumnInfo>
        {
            public bool Equals(ColumnInfo x, ColumnInfo y)
            {
                return x.ColumnName == y.ColumnName;
            }

            public int GetHashCode(ColumnInfo obj)
            {
                return obj.ColumnName.GetHashCode();
            }
        }
    }

然后查询:

        var colComparer = new ColumnInfo.ColumnNameComparer();
        Dictionary<string, List<ColumnInfo>> res = InvalidColumns
            .GroupBy(i => i.Key.TableName)
            .ToDictionary(i => i.Key, i => i.SelectMany(j => j.Value.Distinct(colComparer)).ToList());

关于c# - 在 C# 中使用 LINQ 减少字典中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117880/

相关文章:

c# - 已插入但尚未提交的记录的查询上下文

python - Django 字典键,for 循环中的值不起作用

javascript - 解决方法 : javascript dictionary which takes objects as keys

c# - C# 中的表达式树和惰性求值

c# - ISO 3166-2 代码的国家/地区名称

c# - 如何创建具有计算值的匿名类型

c# - Linq/XML - 你如何处理不存在的节点?

json - 如何通过 key 访问 JSON 中的数据

c# - ExcelDataReader 错误

c# - 既然我们已经有了它的超集抽象类,还需要引入什么接口(interface)呢?