Сгруппировать внутри элемента массива с помощью LINQ

#c# #linq

#c# #linq

Вопрос:

Например:

 var a = new { Key = new[] {1, 2} ... };
var b = new { Key = new[] {2, 3} ... };
var c = new { Key = new[] {3} ... };
  

Я хочу запрос LINQ, который получит результат ниже, после new [] {a, b, c}.GroupByWithArray(x => x.Key)

 Key 1: a
Key 2: a, b
Key 3: b, c
  

Комментарии:

1. Я думаю, что ваш вопрос нуждается в большем уточнении.

Ответ №1:

 var a = new { Key = new[] { 1, 2 }};
var b = new { Key = new[] { 2, 3 }};
var c = new { Key = new[] { 3 }};

var result =
    new[] { a, b, c }.SelectMany(item => item.Key.Select(key => (Item: item, Key: key)))
                     .GroupBy(pair => pair.Key)
                     .ToDictionary(group => group.Key,
                                   group => group.Select(pair => pair.Item).ToArray());

var expected = new Dictionary<int, object[]>
{
    { 1,  new[] { a }},
    { 2,  new[] { a, b }},
    { 3,  new[] { b, c }}
};

result.Should().BeEquivalentTo(expected); // Pass Ok
  

Комментарии:

1. Этот код даже не компилируется. Можете ли вы, пожалуйста, исправить это?

2. И независимо от того, каким способом я добавляю в отсутствующую скобку, я не могу получить на выходе ничего значимого.

3. @Enigmativity, извините, отсутствующая скобка была раньше GroupBy

Ответ №2:

Это кажется наиболее логичным для того, что вы хотите:

 var a = new { Key = new[] { 1, 2 } };
var b = new { Key = new[] { 2, 3 } };
var c = new { Key = new[] { 3 } };

var values = new[] { 'a', 'b', 'c' };

var result =
    new[] { a, b, c }
        .Zip(values, (keys, value) => new { keys, value })
        .SelectMany(x => x.keys.Key, (x, key) => new { key, x.value })
        .GroupBy(x => x.key, x => x.value);

var output =
    String.Join(
        Environment.NewLine,
        result.Select(r => $"Key {r.Key}: {String.Join(", ", r)}"));
  

Это дает:

Ключ 1: a
Ключ 2: a, b
Ключ 3: b, c

Теперь, я не знаю, что вы имели в виду под ... в вашем вопросе, но если я просто предположу, что вы имели в виду, что список может быть длиннее, то это ничего не изменит.

Комментарии:

1. Спасибо. Убедитесь, что … это просто означает, что это значимый объект, ключ — не единственное поле. Я хочу классифицировать эти объекты по ключу.

2. И формат вывода не имеет значения. Я только что показал пример, каким должен быть результат после группировки.