LINQ, cartesian join. Проблема с null
От: __kain Россия  
Дата: 27.06.09 22:32
Оценка:
Доброго времени суток! Есть код, суть которого — перебрать все соединения элементов трех массивов:
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 и все дела. Нет в таблице записей — ничего и не выбралось
Re: LINQ, cartesian join. Проблема с null
От: Lloyd Россия  
Дата: 27.06.09 23:18
Оценка: 1 (1)
Здравствуйте, __kain, Вы писали:

__>Делаю изменение:

__>
__>   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 ?? new string[]{null}
__>                from a2 in array2 ?? new string[]{null}
__>                from a3 in array3 ?? new string[]{null}
__>                select a1 + a2 + a3;

__>            foreach (var element in result_set)
__>            {
__>                Console.WriteLine(element);
__>            }
__>        }
__>    }
__>

__>Как бы так сделать, чтоб если 1 из параметров == null, чтоб он просто не учитывался.

Не совсем было понятно, что значит "просто не учитывался".
Re[2]: LINQ, cartesian join. Проблема с null
От: Ziaw Россия  
Дата: 28.06.09 03:35
Оценка: 3 (1)
Здравствуйте, Lloyd, Вы писали:

__>>
__>>                from a1 in array1 ?? new string[0]
__>>                from a2 in array2 ?? new string[0]
__>>                from a3 in array3 ?? new string[0]
__>>


L>Не совсем было понятно, что значит "просто не учитывался".


Мне кажется имелось ввиду такое.
Re: LINQ, cartesian join. Проблема с null
От: yuriylsh  
Дата: 28.06.09 04:21
Оценка:
Здравствуйте, __kain, Вы писали:

__>Как бы так сделать, чтоб если 1 из параметров == null, чтоб он просто не учитывался.


Сходу ничего лучше чем такое в голову не приходит:

static void Permutate(string[] array1, string[] array2, string[] array3)
{
    Func<string[], string[]> check = array => array ?? new [] {""};
    var result_set = check(array1).SelectMany(a1 => check(array2).SelectMany(a2 => check(array3).Select(a3 => 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.
Re[2]: LINQ, cartesian join. Проблема с null
От: yuriylsh  
Дата: 28.06.09 04:33
Оценка: 1 (1)
Здравствуйте, yuriylsh, Вы писали:
Y>Сходу ничего лучше чем такое в голову не приходит:

Y>
Y>static void Permutate(string[] array1, string[] array2, string[] array3)
Y>{
Y>    Func<string[], string[]> check = array => array ?? new [] {""};
Y>    var result_set = check(array1).SelectMany(a1 => check(array2).SelectMany(a2 => check(array3).Select(a3 => a1 + a2 + a3)));

Y>    foreach (var element in result_set)
Y>    {
Y>        Console.WriteLine(element);
Y>    }
Y>}
Y>


Блин, по привычке написал как мне удобней Ты пользуешься 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.
Re[3]: LINQ, cartesian join. Проблема с null
От: __kain Россия  
Дата: 28.06.09 05:24
Оценка:
Спасибо всем ответившим, все Ваши варианты работют

> Lloyd

Привет братьям-полуночникам
Re[3]: LINQ, cartesian join. Проблема с null
От: Lloyd Россия  
Дата: 28.06.09 12:19
Оценка:
Здравствуйте, Ziaw, Вы писали:

__>>>
__>>>                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 — пустой, то крутить такой нефиговый цикл нет смысла.
Re[4]: LINQ, cartesian join. Проблема с null
От: Smarty Россия  
Дата: 28.06.09 12:56
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Тогда лучше изначально проверить, что нет пустых массивов и если нет, то сразу return.

L>В a1, a2 может быть по миллиону элементов и если a3 — пустой, то крутить такой нефиговый цикл нет смысла.

Идея понятна, но, ИМХО она противоречит условию:

Как бы так сделать, чтоб если 1 из параметров == null, чтоб он просто не учитывался.


То бишь цикл придется и здесь крутить, а равенство a3 нулл просто сократит кол-во итераций.
Re[5]: LINQ, cartesian join. Проблема с null
От: Lloyd Россия  
Дата: 28.06.09 13:25
Оценка:
Здравствуйте, 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 раз и это будет совершенно бессмысленная работа, т.к. уже не входе в эти циклы будет ясно, что результат будет пустой.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.