Блин, по привычке написал как мне удобней Ты пользуешься query expressions, поэтому ближе будет так:
static void Permutate(string[] array1, string[] array2, string[] array3)
{
Func<string[], string[]> check = array => array ?? new [] {""};
var result_set =
from a1 in check(array1)
from a2 in check(array2)
from a3 in check(array3)
select a1 + a2 + a3;
foreach (var element in result_set)
{
Console.WriteLine(element);
}
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
Luck in life always exists in the form of an abstract class that cannot be instantiated directly and needs to be inherited by hard work and dedication.
Доброго времени суток! Есть код, суть которого — перебрать все соединения элементов трех массивов:
class Program
{
static void Main(string[] args)
{
var array1 = new[] { "a", "b", "c" };
var array2 = new[] { "1", "2" };
var array3 = new[] { "|", "_" };
var result_set =
from a1 in array1
from a2 in array2
from a3 in array3
select a1 + a2 + a3;
foreach (var element in result_set)
{
Console.WriteLine(element);
}
}
}
Он выводит на экран:
a1|
a1_
a2|
a2_
b1|
b1_
b2|
b2_
c1|
c1_
c2|
c2_
Делаю изменение:
class Program
{
static void Main(string[] args)
{
var array1 = new[] { "a", "b", "c" };
var array2 = new[] { "1", "2" };
var array3 = new[] { "|", "_" };
Permutate(array1, null/*array2*/, array3);
}
static void Permutate(string[] array1, string[] array2, string[] array3)
{
var result_set =
from a1 in array1
from a2 in array2
from a3 in array3
select a1 + a2 + a3;
foreach (var element in result_set)
{
Console.WriteLine(element);
}
}
}
Как бы так сделать, чтоб если 1 из параметров == null, чтоб он просто не учитывался.
В Oracle все проще — cartesian join и все дела. Нет в таблице записей — ничего и не выбралось
Luck in life always exists in the form of an abstract class that cannot be instantiated directly and needs to be inherited by hard work and dedication.
__>>> from a1 in array1 ?? new string[0]
__>>> from a2 in array2 ?? new string[0]
__>>> from a3 in array3 ?? new string[0]
__>>>
L>>Не совсем было понятно, что значит "просто не учитывался".
Z>Мне кажется имелось ввиду такое.
Тогда лучше изначально проверить, что нет пустых массивов и если нет, то сразу return.
В a1, a2 может быть по миллиону элементов и если a3 — пустой, то крутить такой нефиговый цикл нет смысла.
Здравствуйте, Lloyd, Вы писали:
L>Тогда лучше изначально проверить, что нет пустых массивов и если нет, то сразу return. L>В a1, a2 может быть по миллиону элементов и если a3 — пустой, то крутить такой нефиговый цикл нет смысла.
Идея понятна, но, ИМХО она противоречит условию:
Как бы так сделать, чтоб если 1 из параметров == null, чтоб он просто не учитывался.
То бишь цикл придется и здесь крутить, а равенство a3 нулл просто сократит кол-во итераций.
Здравствуйте, Smarty, Вы писали:
S>Идея понятна, но, ИМХО она противоречит условию:
S>
S>Как бы так сделать, чтоб если 1 из параметров == null, чтоб он просто не учитывался.
S>То бишь цикл придется и здесь крутить, а равенство a3 нулл просто сократит кол-во итераций.
Зависит от того, какие именно итерации ты считаешь.
Кол-во итерации "foreach (var element in result_set)" будет равно 0.
Но кроме явного foreach так есть еще 3 цикла: "for a1 in", "for a2 in", "for a3 in". Если мы будем использовать "?? new string[0]", то цикл "for a2 in" будет прокручен array1.Length * array2.Length раз и это будет совершенно бессмысленная работа, т.к. уже не входе в эти циклы будет ясно, что результат будет пустой.