2012-02-02 33 views
2

我試圖使用LINQ從現有的字典中創建一個新的字典,刪除過程中的重複。在C#中使用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對象的表名屬性和ColumnInfo對象的列表中爲每個表名唯一。

我開始與此基礎上另一篇文章,我發現:

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

這並不因爲第一次的工作()。我想有一種方法可以使用LINQ擴展實現這一點,我只需要一些幫助就可以找到它。

謝謝!

+3

Ouch。爲什麼'LoaderConfig'是一個'struct'?我認爲不應該。 – 2012-02-02 18:34:18

+0

什麼是你的副本?它是表名和列名嗎?這是否是你的'LoaderConfig'和'ColumnInfo'的值? – 2012-02-02 18:45:19

+0

重複將是一個LoaderConfig.TableName和ColumnInfo對象組合。 – Paul 2012-02-02 18:57:01

回答

3

本人來說,我會做這樣的事情:

首先創建一個ColumnInfo的IEqualityComparer(由不同的使用)

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
//untested 
    var alterations = InvalidColumns 
      .GroupBy(pair => pair.Key.TableName) 
      .ToDictionary(group => group.Key, 
          group => group.SelectMany(g => g.Value).Distinct()); 

你必須以某種方式在.Distinct()工作。

編輯確實需要一個Distinct(),添加。

+0

修改您的回答: VAR變更= InvalidColumns .GroupBy(對=> pair.Key.MARSTable) .ToDictionary(組=> group.Key, 組=> group.SelectMany(G => g.Value) 。不同()); 這對我有效。 – Paul 2012-02-02 19:02:45

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平整列列表,即創建表名稱和單個列的枚舉納秒。此枚舉然後由表名重新分組。