#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. И формат вывода не имеет значения. Я только что показал пример, каким должен быть результат после группировки.