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

时间:2012-02-02 18:31:35

标签: 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属性,而ColumnInfo对象列表对于每个TableName都是唯一的。

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

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

由于First()而无法正常工作。我想有一种方法可以使用LINQ扩展来实现这一点,我只需要帮助找到它。

谢谢!

3 个答案:

答案 0 :(得分:3)

Personaly我会做这样的事情:

首先为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());

答案 1 :(得分:1)

  //untested
  var alterations = InvalidColumns
             .GroupBy(pair => pair.Key.TableName)
             .ToDictionary(group => group.Key, 
                           group => group.SelectMany(g => g.Value).Distinct());

你必须以.Distinct()某种方式工作。

编辑确实需要一个Distinct(),添加。

答案 2 :(得分:1)

Dictionary<string, List<ColumnInfo>> alterations = InvalidColumns
    .SelectMany(p => p.Value, (p, col) => new { p.Key.TableName, col })
    .GroupBy(single => single.TableName, single => single.col)
    .ToDictionary(g => g.Key, g => g.Distinct().ToList());

SelectMany使列列表变平,即它创建表名和单列的枚举。然后,这个枚举按表名重新分组。