2012-02-02 4 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; } 
} 

는 내가 함께 결국 원하는 것은 키가 LoaderConfig 오브젝트의 TABLENAME 속성과 ColumnInfo 개체 목록입니다 Dictionary<string, List<ColumnInfo>> 각 TABLENAME 고유되어 다음과 같이

기존 사전입니다 .

나는 내가 찾은 또 다른 게시물에 기반이 시작 :

때문에 먼저 작동하지 않습니다
var alterations = InvalidColumns 
    .GroupBy(pair => pair.Key.TableName) 
    .Select(group => group.First()) 
    .ToDictionary(pair => pair.Key.TableName, pair => pair.Value); 

(). LINQ 확장을 사용하여이를 실현하는 방법이 있다고 상상해보십시오. 찾는 데 도움이 필요합니다.

감사합니다.

+3

아야. 왜'LoaderConfig'는'struct'입니까? 나는 그것이되어야한다고 생각하지 않는다. –

+0

당신을위한 복제물이란 무엇입니까? 테이블 이름과 열 이름입니까? 'LoaderConfig'와'ColumnInfo'의 모든 값입니까? –

+0

복제본은 LoaderConfig.TableName 및 ColumnInfo 개체 조합이됩니다. – Paul

답변

3

는 Personaly I는 다음과 같이 할 수 있습니다 :

먼저 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

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 컬럼리스트를 평탄하게 만든다. 즉, 테이블 이름과 단일 컬럼의 열거를 생성한다. ns. 이 열거 형은 테이블 이름으로 다시 그룹화됩니다.

관련 문제