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
От: 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
От: 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.
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
От: 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[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...
Пока на собственное сообщение не было ответов, его можно удалить.