GroupBy список пар ключ-значение, затем перегруппировать результат - PullRequest
2 голосов
/ 26 марта 2019

Я хочу сгруппировать список пар «ключ-значение» по ключу, а затем сгруппировать все ключи, имеющие одинаковый список значений.

Вот пример

| Key | Value |
|:----|------:|
| 1   | A     |
| 1   | B     |
| 1   | C     |
| 2   | A     |
| 2   | B     |
| 3   | A     |

Вот результат, который я хотел бы получить

| Keys | Values |
|:-----|-------:|
| 1,2  | A,B    |
| 1    | C      |
| 3    | A      |

Я начал с классического GroupBy, но застрял на втором шаге, чтобы сгруппировать ключи

var pairs = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("1", "A"),
    new KeyValuePair<string, string>("1", "B"),
    new KeyValuePair<string, string>("1", "C"),
    new KeyValuePair<string, string>("2", "A"),
    new KeyValuePair<string, string>("2", "B"),
    new KeyValuePair<string, string>("3", "A")
};
var groupingFirstStep = pairs.GroupBy(p => p.Key);

| Key  | Values |
|:-----|-------:|
| 1    | A,B,C  |
| 2    | A,B    |
| 3    | A      |

Другие примеры: слева ввод, справа ожидаемый результат

| Key | Value |          | Keys | Values |
|:----|------:|          |:-----|-------:|
| 1   | A     |          | 1,2  | A,B    |
| 1   | B     |
| 2   | A     |
| 2   | B     |

| Key | Value |          | Keys | Values |
|:----|------:|          |:-----|-------:|
| 1   | A     |          | 1,2  | A,B    |
| 1   | B     |          | 1    | C      |
| 1   | C     |
| 2   | A     |
| 2   | B     |

| Key | Value |          | Keys | Values |
|:----|------:|          |:-----|-------:|
| 1   | A     |          | 1,2  | A,B    |
| 1   | B     |          | 1,3  | C      |
| 1   | C     |          | 3    | A      |
| 2   | A     |
| 2   | B     |          Other possibility
| 3   | A     |          | 1,3  | A,C    |
| 3   | C     |          | 1,2  | B      |
                         |   2  | A      |

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Я думаю, это то, что вам нужно. Я опустил KeyValuePair с C, потому что предположил, что вы хотели бы знать, как группировать ключи, когда значение (в данном случае A,B) одинаково:

var pairs = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("1", "A"),
    new KeyValuePair<string, string>("1", "B"),
    new KeyValuePair<string, string>("2", "A"),
    new KeyValuePair<string, string>("2", "B"),
    new KeyValuePair<string, string>("3", "A")
};
var grouping = pairs.GroupBy(p => p.Key)
  .GroupBy(g => string.Join(",", g.Select(kvp => kvp.Value)));
0 голосов
/ 29 марта 2019

Вы можете использовать эту перегрузку из .GroupBy для проецирования значений из нее.

Примерно так:

static void Main(string[] args)
{
    var pairs = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("1", "A"),
        new KeyValuePair<string, string>("1", "B"),
        new KeyValuePair<string, string>("1", "C"),
        new KeyValuePair<string, string>("2", "A"),
        new KeyValuePair<string, string>("2", "B"),
        new KeyValuePair<string, string>("3", "A")
    };

    IEnumerable<string> groupings = pairs.GroupBy(x => x.Key, x => x.Value, (x, y) => $"{x}\t|\t{string.Join(",", y)}");

    foreach (string groupItem in groupings)
    {
        Console.WriteLine(groupItem);
    }
} 

Выведение:

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