我正在尝试使用 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/