Сокращение дубликатов в словаре с помощью LINQ в C # - PullRequest
2 голосов
/ 02 февраля 2012

Я пытаюсь использовать 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>>, где ключ - это атрибут TableName объектов LoaderConfig, а список объектов 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 ]

3 голосов
/ 02 февраля 2012

Лично я сделаю что-то вроде этого:

Сначала создайте IEqualityComparer для ColumnInfo (используется 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 голос
/ 02 февраля 2012
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 сглаживает списки столбцов, т. Е. Создает перечисление имен таблиц и отдельных столбцов.Это перечисление затем перегруппируется по имени таблицы.

1 голос
/ 02 февраля 2012
  //untested
  var alterations = InvalidColumns
             .GroupBy(pair => pair.Key.TableName)
             .ToDictionary(group => group.Key, 
                           group => group.SelectMany(g => g.Value).Distinct());

А вы должны как-то работать в .Distinct().

Редактировать Функция Distinct () действительно нужна, добавлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...