Я искал способ найти продукт из нескольких списков; Я использовал популярный ответ, который использует Aggregate + SelectMany. Проблема в том, что мой пример работает очень медленно: у меня есть 4 списка по 3К записей в каждом, и мне нужно перечислить каждую возможную комбинацию.
Кто-нибудь знает более быстрый путь в C#?
Я сделал скрипку здесь , которой в настоящее время не хватает памяти.
Ниже приведен код ссылки скрипты
public static void Main()
{
var sources = new[]
{
Enumerable.Range(1, 3000),
Enumerable.Range(1, 3000),
Enumerable.Range(1, 3000),
Enumerable.Range(1, 3000),
};
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
Console.Write("linq way...");
foreach(var l in NCartesian(sources))
{
// just enumerate
}
Console.WriteLine("{0}ms", sw.ElapsedMilliseconds);
}
public static IEnumerable<IEnumerable<T>> NCartesian<T>(
IEnumerable<IEnumerable<T>> sequences)
{
if (sequences == null)
{
return null;
}
IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>()
};
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) => accumulator.SelectMany(
accseq => sequence,
(accseq, item) => accseq.Concat(new[] { item })));
}