Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2011, 09:58   #1
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость LINQ C#

Ребята помогите пожалуйста разобраться.

Вот программа, она правильно работает, но я не совсем понял, как.

Весь массив string[] strs ={"alpha", "beta", "gammma"};
преобразуется в chrArray={'a','l','p','h','a','b',' e','t','a','g','a','m','m','m','a'}
затем сортируется и возвращается.
Или может преобразуется в три массива символов?
Подскажите пожалуйста!


Код:
class Program
    {
        static void Main()
        {
            string[] strs ={"alpha", "beta", "gammma"};

            var chrs = from str in strs
                       let chrArray = str.ToCharArray()
                       from ch in chrArray
                       orderby ch
                       select ch;

            Console.WriteLine("Отдельные символы отсортированные по порядку:");

            foreach (char c in chrs) Console.Write(c + " ");
        }
    }
sir.andrey вне форума Ответить с цитированием
Старый 29.09.2011, 10:51   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

переменная chrs - это у Вас массив символов.
он получается путём преобразования каждой исходной строки в набор символов.
полученный набор символов сортируется orderby.

примечания.
1-х. имхо, код можно чуть сократить:
Код:
              var chrs = from str in strs
                         from ch in str.ToCharArray()
                         orderby ch
                         select ch;
я не спец в C# и уж тем более в LINQ и не знаю, чем эта запись отличается от исходной (думаю, что ничем )

2-е
попробуйте убрать orderby ch, выполнить код и вы увидите, что содержимое массива chrs - это будет набор символов, составлюящих исходные строчки:
a l p h a b e t a g a m m m a
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.09.2011, 11:00   #3
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Почему эта строка кода не допустима?

Цитата:
char[] str = strs.ToCharArray();

Последний раз редактировалось sir.andrey; 29.09.2011 в 11:03.
sir.andrey вне форума Ответить с цитированием
Старый 29.09.2011, 11:10   #4
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Цитата:
Почему эта строка кода не допустима?

Цитата:
string[] str = strs.ToCharArray();
Это я уже понял.

получается, в этом коде берется по одному элементу( строке) и все эти эл-ты присваиваются ( по принципу "+=") в chrArray, а только потом сортируются?
Я просто думал, что если внутри from еще один from, , то это что-то типа вложенных циклов, а оказывается нет.

Код:
var chrs = from str in strs
                       let chrArray = str.ToCharArray()
                       from ch in chrArray
                       orderby ch
                       select ch;
т.к. это эквивалентно
коду, только без сортировки

Код:
foreach (string s in strs) {
                char[] ch = s.ToCharArray();
                for (int i = 0; i < ch.Length; i++ )
                    Console.Write(ch[i]+" ");
            }

Последний раз редактировалось sir.andrey; 29.09.2011 в 11:23.
sir.andrey вне форума Ответить с цитированием
Старый 29.09.2011, 11:49   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

с коллегой поделился примером кода, он (в отличие от меня) знает получше C#.

он набросал ещё такой вариант решения:
Код:
            var chrs = strs.Aggregate(new char[] { }, (result, next) => result.Concat(next).ToArray())
                .OrderBy(c => c);

p.s. вот что меня немного напрягает в C#, что одно и то же может быть сделано МНОЖЕСТВОМ различных способов.. я не скажу, что это плохо.
Но как то в других языках решение какой-то задачи более детерменировано: программист вынужден использовать только те способы/методы доступа к данным, которые предоставляет язык. Тут, конечно, тоже самое, но этих методов/способов НАМНОГО больше...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.09.2011, 11:52   #6
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
с коллегой поделился примером кода, он (в отличие от меня) знает получше C#.

он набросал ещё такой вариант решения:
Код:
            var chrs = strs.Aggregate(new char[] { }, (result, next) => result.Concat(next).ToArray())
                .OrderBy(c => c);

p.s. вот что меня немного напрягает в C#, что одно и то же может быть сделано МНОЖЕСТВОМ различных способов.. я не скажу, что это плохо.
Но как то в других языках решение какой-то задачи более детерменировано: программист вынужден использовать только те способы/методы доступа к данным, которые предоставляет язык. Тут, конечно, тоже самое, но этих методов/способов НАМНОГО больше...
До этого я еще не дошел, но в общем хоть как то я понял принцип.
Спасибо за помощь!
sir.andrey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по LINQ kaljan775 C# (си шарп) 1 28.08.2011 17:49
LINQ to XML iiunbreakableii C# (си шарп) 0 03.08.2011 18:35
Sql to Linq VB Silvan90 Помощь студентам 5 02.08.2011 12:35
LINQ и MySQL nec117 C# (си шарп) 5 13.05.2011 19:54
LINQ + MySQL tavrocotaps Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 20.07.2010 17:21