делать ли это, что вы хотите?
Func<string[][], string[][]> build = null;
build = s =>
s.Length == 1
? s[0].Select(x => new [] { x }).ToArray()
: build(s.Skip(1).ToArray())
.SelectMany(xs => s[0].Select(x => new [] { x }.Concat(xs).ToArray()))
.ToArray();
Это базовый случай в этом запросе, когда s.Length == 1
в основном превращается в new [] { new [] { "onion", "potato", "tomato", "beans" } }
new [] { new [] { "onion", }, new [] { "potato", }, new [] { "tomato", }, new [] { "beans", }, }
. Небазовый регистр рекурсивно вызывает build
, а затем добавляет к началу каждого рекурсивного массива значения первого массива. Рад, что вы спросили?
В качестве альтернативы я мог бы написать этот запрос, как это:
Func<string[][], string[][]> build = null;
build = s =>
(
s.Length == 1
? from x in s[0] select new [] { x }
: from xs in build(s.Skip(1).ToArray())
from x in s[0] select new [] { x }.Concat(xs).ToArray()
).ToArray();
Это может помочь вам разбить его проще.
Если я начну с этими данными:
var source = new []
{
new { Key = "colour", Value = "red", },
new { Key = "colour", Value = "blue", },
new { Key = "colour", Value = "violet", },
new { Key = "colour", Value = "black", },
new { Key = "colour", Value = "yellow", },
new { Key = "fruit", Value = "apple", },
new { Key = "fruit", Value = "mango", },
new { Key = "fruit", Value = "banana", },
new { Key = "vegetable", Value = "onion", },
new { Key = "vegetable", Value = "potato", },
new { Key = "vegetable", Value = "tomato", },
new { Key = "vegetable", Value = "beans", },
};
string[][] data =
source
.ToLookup(x => x.Key, x => x.Value)
.Select(x => x.ToArray())
.ToArray();
Я получаю этот результат:
new []
{
new [] { "red", "apple", "onion" }
new [] { "blue", "apple", "onion" }
new [] { "violet", "apple", "onion" }
new [] { "black", "apple", "onion" }
new [] { "yellow", "apple", "onion" }
new [] { "red", "mango", "onion" }
new [] { "blue", "mango", "onion" }
new [] { "violet", "mango", "onion" }
new [] { "black", "mango", "onion" }
new [] { "yellow", "mango", "onion" }
new [] { "red", "banana", "onion" }
new [] { "blue", "banana", "onion" }
new [] { "violet", "banana", "onion" }
new [] { "black", "banana", "onion" }
new [] { "yellow", "banana", "onion" }
new [] { "red", "apple", "potato" }
new [] { "blue", "apple", "potato" }
new [] { "violet", "apple", "potato" }
new [] { "black", "apple", "potato" }
new [] { "yellow", "apple", "potato" }
new [] { "red", "mango", "potato" }
new [] { "blue", "mango", "potato" }
new [] { "violet", "mango", "potato" }
new [] { "black", "mango", "potato" }
new [] { "yellow", "mango", "potato" }
new [] { "red", "banana", "potato" }
new [] { "blue", "banana", "potato" }
new [] { "violet", "banana", "potato" }
new [] { "black", "banana", "potato" }
new [] { "yellow", "banana", "potato" }
new [] { "red", "apple", "tomato" }
new [] { "blue", "apple", "tomato" }
new [] { "violet", "apple", "tomato" }
new [] { "black", "apple", "tomato" }
new [] { "yellow", "apple", "tomato" }
new [] { "red", "mango", "tomato" }
new [] { "blue", "mango", "tomato" }
new [] { "violet", "mango", "tomato" }
new [] { "black", "mango", "tomato" }
new [] { "yellow", "mango", "tomato" }
new [] { "red", "banana", "tomato" }
new [] { "blue", "banana", "tomato" }
new [] { "violet", "banana", "tomato" }
new [] { "black", "banana", "tomato" }
new [] { "yellow", "banana", "tomato" }
new [] { "red", "apple", "beans" }
new [] { "blue", "apple", "beans" }
new [] { "violet", "apple", "beans" }
new [] { "black", "apple", "beans" }
new [] { "yellow", "apple", "beans" }
new [] { "red", "mango", "beans" }
new [] { "blue", "mango", "beans" }
new [] { "violet", "mango", "beans" }
new [] { "black", "mango", "beans" }
new [] { "yellow", "mango", "beans" }
new [] { "red", "banana", "beans" }
new [] { "blue", "banana", "beans" }
new [] { "violet", "banana", "beans" }
new [] { "black", "banana", "beans" }
new [] { "yellow", "banana", "beans" }
}
Это работает с любым количеством клавиш.
Попробуйте эти данные:
var source = new []
{
new { Key = "colour", Value = "red", },
new { Key = "fruit", Value = "apple", },
new { Key = "vegetable", Value = "onion", },
new { Key = "nation", Value = "france", },
new { Key = "nation", Value = "australia", },
};
Я получаю этот результат:
new []
{
new [] { "red", "apple", "onion", "france" }
new [] { "red", "apple", "onion", "australia" }
}
Если ключ является int
то код работает точно так же:
var source = new[]
{
new { Key = 1, Value = "red", },
new { Key = 1, Value = "apple", },
new { Key = 2, Value = "onion", },
new { Key = 3, Value = "france", },
new { Key = 3, Value = "australia", },
};
string[][] data =
source
.ToLookup(x => x.Key, x => x.Value)
.Select(x => x.ToArray())
.ToArray();
Func<string[][], string[][]> build = null;
build = s =>
(
s.Length == 1
? from x in s[0] select new[] { x }
: from xs in build(s.Skip(1).ToArray())
from x in s[0]
select new[] { x }.Concat(xs).ToArray()
).ToArray();
Вот неанонимный версия build
:
public string[][] Build(string[][] source)
{
return
(
source.Length == 1
? from x in source[0] select new[] { x }
: from xs in Build(source.Skip(1).ToArray())
from x in source[0]
select new[] { x }.Concat(xs).ToArray()
).ToArray();
}
Ваше описание не слишком ясно (и вы не должны ссылаться на внешний пост, не имеет значения, принадлежит ли сайт SE), но ваш код имеет разные биты, которые скорее всего ошибочны (или не идеальны) , Например: две самые внешние петли foreach (foreach (var x in model) и foreach (элемент var в модели)) делают что-то, чего вы, разумеется, не хотите: итерация через все элементы в модели раз все элементы модели ; на самом деле вы даже не используете переменную, повторяющуюся через первый цикл (x). Другая не слишком правильная проблема (и/или странная) - var model1 = new. Список() ;. –
varocarbas
Кроме того, исходное сообщение (содержимое которого должно быть включено здесь) не описывает четко то, что вы хотите. Создание алгоритма для вас здесь не совсем по теме (и я думаю, что ни в программистах); но вы можете получить некоторые подсказки, если вы правильно описываете ситуацию. Например: предоставить образец ввода (упрощенный) и описать точное поведение, которое вы хотите выполнить. – varocarbas
Но разве я не включил образец вывода и вывод, который я получаю сейчас? И в предыдущем вопросе есть изображение ввода. Но я могу добавить набор входных данных к этому вопросу. – Vini