нужны вопросы для интервью .NET developers

Дамы и господа, ПМ попросил подобрать вопросы для технического теста
[quote:2kgvtywr]The questions can be short with multiple choices (can be a trap) or longer questions. However, the overall test should not take more than 30 minutes so I’d like to get mostly multiples choice questions and around 2 longer questions. This test will also be used to evaluate all level of developers (junior to senior) so we need to have questions of all levels.
[/quote:2kgvtywr]
есть у кого что-нить интересное?

Лепин
Лепин
Статей: 47

Комментариев нет

  1. [quote="Ghost":1pchb6av]http://j.mp/12mb2B6 :s78: :s1:[/quote:1pchb6av]
    не, так я и сам могу.
    Я хочу творчества. вот, например:

    What will be printed as the result of this code execution?
    [code:1pchb6av]
    List<int> aList = new List<int>() {1,2,2,3,4};
    aList.Where(r => r == 2).Select(r => { r = 9; Console.Write(r); return r; });
    [/code:1pchb6av]
    [list:1pchb6av]
    [*:1pchb6av]22[/*:m:1pchb6av]
    [*:1pchb6av]99[/*:m:1pchb6av]
    [*:1pchb6av]nothing[/*:m:1pchb6av][/list:u:1pchb6av]

  2. [quote="Лепин":31o9g1g5][quote="Ghost":31o9g1g5]http://j.mp/12mb2B6 :s78: :s1:[/quote:31o9g1g5]
    не, так я и сам могу.
    Я хочу творчества. вот, например:
    [/quote:31o9g1g5]

    а в чем тут творчество?

  3. [quote="Algo":az7pz04p][quote="Лепин":az7pz04p][quote="Ghost":az7pz04p]http://j.mp/12mb2B6 :s78: :s1:[/quote:az7pz04p]
    не, так я и сам могу.
    Я хочу творчества. вот, например:
    [/quote:az7pz04p]

    а в чем тут творчество?[/quote:az7pz04p]
    В том, что вопрос сам сотворил :)
    Ладно, всем спасибо :)
    отправил ссылки от Ghosta и Googla и тройку своих вопросов.
    Впрочем, если что еще кому в голову придет — пишите :)

  4. [quote="Лепин":3dd7of0y]Дамы и господа, ПМ попросил подобрать вопросы для технического теста
    [quote:3dd7of0y]The questions can be short with multiple choices (can be a trap) or longer questions. However, the overall test should not take more than 30 minutes so I’d like to get mostly multiples choice questions and around 2 longer questions. This test will also be used to evaluate all level of developers (junior to senior) so we need to have questions of all levels.
    [/quote:3dd7of0y]
    есть у кого что-нить интересное?[/quote:3dd7of0y]

    Так ты определись сперва, кто конкретно тебе нужен и какие области надо проверить
    А потом уже думать можно
    А то мож вам надо спецы по sql больше, а ты будешь давать тест на, скажем, как имплементить монады в сишарпе

  5. а мне кажется, что нужно как-то общее понимание вопроса проверять. А то какие-то конкретные фичи языка кандидат может просто не использовать в повседневной практике, но при необходимости быстро узнать-вспомнить. Но его отсеют на тесте… И пройдут только те, кто на старом месте работы занимался тем же самым..

  6. [quote="Лепин":2htbutu2]
    aList.Where(r => r == 2).Select(r => { r = 9; Console.Write(r); return r; });
    [/quote:2htbutu2]

    ничего не будет, енумерация не вызвана
    А составителю за такой код надо оторвать руки по самые уши

  7. [quote="Algo":1v200oul]а мне кажется, что нужно как-то общее понимание вопроса проверять. А то какие-то конкретные фичи языка кандидат может просто не использовать в повседневной практике, но при необходимости быстро узнать-вспомнить. Но его отсеют на тесте… И пройдут только те, кто на старом месте работы занимался тем же самым..[/quote:1v200oul]
    Обще ответы на общие вопросы люди в общем знают.
    По сути нам нужны ремесленники. Область применения — всевозможные бизнес приложения. То есть нужно знать, как более менее стандартными способами решить более менее стандартные задачи. Желательно быстро, эффективно, тестируемо и понятно для остальных.
    Язык, по сути, не важен. хотя VB.NET остался только на легаси проектах и даже там умудряется постепенно мигрировать в c#.
    Вот пример Linq, что я дал выше, извращен немного, но даст однозначно понять, используется ли Linq.
    Или вот еще, тоже из моей тройки:
    Ответ (даже неправильный), как мне кажется, даст оценить уровень знания платформы.

    What should be done to be able to do this call:

    int b = «two words».WordCount();
    [list:1v200oul]
    [*:1v200oul]Nothing. int WordCount(String str) is the build-in method of the String class[/*:m:1v200oul]
    [*:1v200oul]Declare public partial class String and implement int WordCount(String str) method in it[/*:m:1v200oul]
    [*:1v200oul]Declare a static class and implement extension method there[/*:m:1v200oul]
    [*:1v200oul]Create a custom class, inherited from System.String, implement method int WordCount(String str)there[/*:m:1v200oul]
    [*:1v200oul]It is impossible, String literals cannot be extended[/*:m:1v200oul][/list:u:1v200oul]

  8. [quote="loco":gwzvdcnm][quote="Лепин":gwzvdcnm]
    aList.Where(r => r == 2).Select(r => { r = 9; Console.Write(r); return r; });
    [/quote:gwzvdcnm]

    ничего не будет, енумерация не вызвана
    А составителю за такой код надо оторвать руки по самые уши[/quote:gwzvdcnm]
    э, рукоотрыватель, предложи свой вариант простой и короткий.
    впрочем Console.Write(r); наверно стоит убрать и просто изменить вопрос «что будет в результате?»

    What will be in the anotherList?

    List<int> aList = new List<int>() {1,2,2,3,4};
    List<int> anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });

  9. [quote="Лепин":19ewh4hb]
    What will be in the anotherList?

    List<int> aList = new List<int>() {1,2,2,3,4};
    List<int> anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });[/quote:19ewh4hb]

    Код не скомпилится, что будет:)

    var aList = new List<int>() {1,2,2,3,4};
    var anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });

    и даже в этом случае ничего не будет!

    Про примеры — надо подумать.

  10. [quote="loco":3r6mg13n][quote="Лепин":3r6mg13n]
    What will be in the anotherList?

    List<int> aList = new List<int>() {1,2,2,3,4};
    List<int> anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });[/quote:3r6mg13n]

    Код не скомпилится, что будет:)

    var aList = new List<int>() {1,2,2,3,4};
    var anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });

    и даже в этом случае ничего не будет!

    Про примеры — надо подумать.[/quote:3r6mg13n]
    Решил таки оставить как есть, но добавить вариант ответа
    • Compile time error will be generated. Console.Write(r) is a method and cannot be used in Linq expressions

  11. [quote="Ghost":flu7znui]так а че, дядя насяльника решила сэкономить на онлайн тестах коих полно? :roll:[/quote:flu7znui]
    а фиг его знает :) может не доверяет он им :)

  12. [quote="Лепин":10c1erhd][quote="loco":10c1erhd][quote="Лепин":10c1erhd]
    What will be in the anotherList?

    List<int> aList = new List<int>() {1,2,2,3,4};
    List<int> anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });[/quote:10c1erhd]

    Код не скомпилится, что будет:)

    var aList = new List<int>() {1,2,2,3,4};
    var anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });

    и даже в этом случае ничего не будет!

    Про примеры — надо подумать.[/quote:10c1erhd]
    Решил таки оставить как есть, но добавить вариант ответа
    • Compile time error will be generated. Console.Write(r) is a method and cannot be used in Linq expressions[/quote:10c1erhd]

    Ну вообще-то нормально компилится и с Console.Write
    а если добавить енумерацию или ТуЛист/аррей, то и работает.
    а эта дискуссия как раз и иллюстрирует, что вполне нормальный кандидат может просто по незнанию какойто мелочи завалить.
    Даже и не по незнанию, а просто не вспомнилось в стрессовой ситуации.
    То есть этот тест ничо не показывает о кандидате

  13. [quote="Лепин":3e1ytefk]То есть нужно знать, как более менее стандартными способами решить более менее стандартные задачи. Желательно быстро, эффективно, тестируемо и понятно для остальных.
    [/quote:3e1ytefk]

    это выявляется тестовым заданием — посмотреть какой код пишет данный кандидат.

  14. [quote="Algo":149evjwj][quote="Лепин":149evjwj][quote="loco":149evjwj][quote="Лепин":149evjwj]
    What will be in the anotherList?

    List<int> aList = new List<int>() {1,2,2,3,4};
    List<int> anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });[/quote:149evjwj]

    Код не скомпилится, что будет:)

    var aList = new List<int>() {1,2,2,3,4};
    var anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });

    и даже в этом случае ничего не будет!

    Про примеры — надо подумать.[/quote:149evjwj]
    Решил таки оставить как есть, но добавить вариант ответа
    • Compile time error will be generated. Console.Write(r) is a method and cannot be used in Linq expressions[/quote:149evjwj]

    Ну вообще-то нормально компилится и с Console.Write
    а если добавить енумерацию или ТуЛист/аррей, то и работает.
    а эта дискуссия как раз и иллюстрирует, что вполне нормальный кандидат может просто по незнанию какойто мелочи завалить.
    Даже и не по незнанию, а просто не вспомнилось в стрессовой ситуации.
    То есть этот тест ничо не показывает о кандидате[/quote:149evjwj]
    так понятно, что нормально компилится.
    Compile time error — неправильный вариант ответа. Там еще два неправильных. правильный ответ дал Loco в самом начале — нифига не будет, Linq is lazy. В этом и поинт — попытаться понять насколько человек ИСПОЛЬЗУЕТ linq. ToList() (или любой другой «пинок» на выполнение) сам не пишется, его добавлять надо.
    То есть даст ответ «22» или Comiple Time Error — вообще ниче не понимает.
    «99» — возможно, использует, но немного.
    Nothing — (что есть правильно) — вроде понимает.

  15. [quote="Algo":aguo52ul][quote="Лепин":aguo52ul]То есть нужно знать, как более менее стандартными способами решить более менее стандартные задачи. Желательно быстро, эффективно, тестируемо и понятно для остальных.
    [/quote:aguo52ul]

    это выявляется тестовым заданием — посмотреть какой код пишет данный кандидат.[/quote:aguo52ul]
    Это, возможно, потом будет. Вопросы которые собираются — это получасовой tech test

  16. [quote="Лепин":7q3wjbhb]
    так понятно, что нормально компилится.
    Compile time error — неправильный вариант ответа. Там еще два неправильных. правильный ответ дал Loco в самом начале — нифига не будет, Linq is lazy. В этом и поинт — попытаться понять насколько человек ИСПОЛЬЗУЕТ linq. [/quote:7q3wjbhb]

    ах вононочо… :roll:

    ну я б наверно ответила про две девятки. хотя линк использую с утра до ночи….

  17. [quote="Лепин":3tq8xnxv][quote="loco":3tq8xnxv][quote="Лепин":3tq8xnxv]
    What will be in the anotherList?

    List<int> aList = new List<int>() {1,2,2,3,4};
    List<int> anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });[/quote:3tq8xnxv]

    Код не скомпилится, что будет:)

    var aList = new List<int>() {1,2,2,3,4};
    var anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });

    и даже в этом случае ничего не будет!

    Про примеры — надо подумать.[/quote:3tq8xnxv]
    Решил таки оставить как есть, но добавить вариант ответа
    • Compile time error will be generated. Console.Write(r) is a method and cannot be used in Linq expressions[/quote:3tq8xnxv]

    да не
    не в том дело
    многие методы linq возвращает IEnumerable<T>
    И это не массив, это функция, при помощи которой будут выбираться элементы при вызове GetEnumerable
    Т.е., ошибка будет просто из-за несоответствия типа; решарпер, к примеру, сразу ее покажет
    Далее, выражение var anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; }); — это функция, это не лист
    Чтобы спровоцировать ее исполнение, надо спровоцировать вызов GetEnumerable, т.е., либо вызвать Count() or ToList() or Any(), or foreach или другие методы

    Соответственно, вопрос о том, что внутри листа не имеет смысла — т.к. листа еще нету

  18. [quote="Лепин":a0gcmbwy]
    List<int> anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; })
    так понятно, что нормально компилится.[/quote:a0gcmbwy]

    нет, Select вернет IEnumerable<int>
    List<int> is IEnumerable<int>, but IEnumerable<int> is not List<int>

  19. Вот еще вопрос
    for(int i = 0; i < 100; ++i)
    {
    var img = Image.FromFile(«someImage.jpg»);
    //do smth with image
    }

    Вопрос — Что здесь неправильно?
    Ответ — надо вызывать Dispose для img

    Вопрос сложнее
    А если не вызвать, что тогда?
    Ответ
    А ничего тогда, gc их все равно подберет

    Вопрос сложнее
    Почему подберет?
    Ответ
    Потому что Image is Finalizable и рано или поздно Finalize will be called and will free unmanaged resources

    Вопрос на засыпку
    А зачем тогда надо вызывать Dispose?
    Ответ
    Потому что время финализации не определено.
    Иначе говоря, быть уверенным что обьект is finalized and unmanaged resources are freed можно только после второй чистки памяти.
    А за это время ее вполне может не хватить.

  20. [quote="loco":8dtk69nd][quote="Лепин":8dtk69nd][quote="loco":8dtk69nd][quote="Лепин":8dtk69nd]
    What will be in the anotherList?

    List<int> aList = new List<int>() {1,2,2,3,4};
    List<int> anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });[/quote:8dtk69nd]

    Код не скомпилится, что будет:)

    var aList = new List<int>() {1,2,2,3,4};
    var anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });

    и даже в этом случае ничего не будет!

    Про примеры — надо подумать.[/quote:8dtk69nd]
    Решил таки оставить как есть, но добавить вариант ответа
    • Compile time error will be generated. Console.Write(r) is a method and cannot be used in Linq expressions[/quote:8dtk69nd]

    да не
    не в том дело
    многие методы linq возвращает IEnumerable<T>
    И это не массив, это функция, при помощи которой будут выбираться элементы при вызове GetEnumerable
    Т.е., ошибка будет просто из-за несоответствия типа; решарпер, к примеру, сразу ее покажет
    Далее, выражение var anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; }); — это функция, это не лист
    Чтобы спровоцировать ее исполнение, надо спровоцировать вызов GetEnumerable, т.е., либо вызвать Count() or ToList() or Any(), or foreach или другие методы

    Соответственно, вопрос о том, что внутри листа не имеет смысла — т.к. листа еще нету[/quote:8dtk69nd]
    доказать-то что хотел? то что я написал и это не скомпилится?
    List<int> anotherList = aList.Where(r => r == 2).Select(r => { r = 9; return r; });
    Ну да, ошибся с синтаксисом, скопипастил. Нефиг было изначальную идею критиковать. :)
    Вообще-то посыл был дать пример с обновлением коллекции внутри линка, без исполнения выражения. И увидеть, знает ли человек, что это можно делать и знает ли что выражение выполняется в момент, когда запрашивается результат.

  21. [quote="loco":1nayz1vv]Вот еще вопрос
    for(int i = 0; i < 100; ++i)
    {
    var img = Image.FromFile(«someImage.jpg»);
    //do smth with image
    }

    Вопрос — Что здесь неправильно?
    Ответ — надо вызывать Dispose для img

    Вопрос сложнее
    А если не вызвать, что тогда?
    Ответ
    А ничего тогда, gc их все равно подберет

    Вопрос сложнее
    Почему подберет?
    Ответ
    Потому что Image is Finalizable и рано или поздно Finalize will be called and will free unmanaged resources

    Вопрос на засыпку
    А зачем тогда надо вызывать Dispose?
    Ответ
    Потому что время финализации не определено.
    Иначе говоря, быть уверенным что обьект is finalized and unmanaged resources are freed можно только после второй чистки памяти.
    А за это время ее вполне может не хватить.[/quote:1nayz1vv]
    кстати, навеяло…
    JVM GC может вовсе не стартовать, даже если его «попросить». Если бесхозные объекты создавать быстро и они маленькие, он ими пренебрегает. Но если объектов много, память тупо кончается.
    встречался пару лет назад…

  22. [quote="Лепин":2s2c2vs4]
    Ну да, ошибся с синтаксисом, скопипастил. Нефиг было изначальную идею критиковать. :)
    Вообще-то посыл был дать пример с обновлением коллекции внутри линка, без исполнения выражения. И увидеть, знает ли человек, что это можно делать и знает ли что выражение выполняется в момент, когда запрашивается результат.[/quote:2s2c2vs4]

    Да фиг-то там:)
    Пример будет некорректным, если у тебя возвернут List<T>, значить енумерация уже случилась;)

    Вот еще тебе вопрос:
    var list = new List<int>{1};
    var q = list.AsQueryable();
    ..
    var value1 = list.Take(1);
    var value2 = q.Take(1);

    Вопрос
    В чем разница в этих вызовах?
    Ответ
    AsQueryable() спровоцирует генерацию ExpressionTree на рантайме
    T.e., DLR сгенерит assembly->namespace->type->method
    Это дооолго

    Еще вопрос.
    Расположите следующие entity в порqдке возрастания времени исполнения
    event
    virtual method
    delegate
    instance method

    otvet

    instance method
    virtual method
    delegate
    event

  23. [quote="Лепин":8noqx6kl]
    кстати, навеяло…
    JVM GC может вовсе не стартовать, даже если его «попросить». Если бесхозные объекты создавать быстро и они маленькие, он ими пренебрегает. Но если объектов много, память тупо кончается.
    встречался пару лет назад…[/quote:8noqx6kl]

    Кстати, еще вопрос м.б.
    1. Когда вызывается GC?
    2. При вызове GC, проверяет ли он все обьекты в памяти, и если нет, какие не проверяет

  24. [quote="Algo":2fjb6h6i]Ну вот пошли нормальные детские вопросы :D
    Правда multiple choice к ним не прикрутишь[/quote:2fjb6h6i]

    Ну почему детские
    Нормальные для затравки.
    Да и сложные вопросы предполагают некоторую внутрикомпанейскую специфику, которую кандидат вполне может и не знать.

  25. ok, простой пример из реальной жизни, есть код

    [code:29giucsn]TAccpacVendors vendors = new TAccpacVendors();
    vendors.Table.LoadAllByStatus(TAccpacExport.Status.Pending); //loading from DB

    foreach (AccpacVendorsDataSet.AccpacVendorsRow rowVendor in vendors.Table) {
    if (rowVendor.Type == TAccpacExport.VendorCustomerType.ClientDivision && !rowVendor.Confirmed) {
    messages.Add("Vendor " + rowVendor.VendorNumber + " must be Confirmed for the export.");
    }
    }[/code:29giucsn]

    типы и переменные (упрощенно):
    vendors.Table is AccpacVendorsDataSet.AccpacVendorsDataTable : DataTable, IEnumerable<T>, IEnumerable where T : global::System.Data.DataRow
    AccpacVendorsDataSet.AccpacVendorsRow : System.Data.DataRow
    AccpacVendorsDataSet : System.Data.DataSet

    messages is List<string>

    надо переписать цикл «красиво, просто, компактно и понятно» на LINQ; и надо ли?

    а если условие внутри цикла ветвящееся и для разных условий разную операцию надо делать?

  26. [quote="Ghost":1ntemu9c]ok, простой пример из реальной жизни, есть код

    надо переписать цикл «красиво, просто, компактно и понятно» на LINQ; и надо ли?

    а если условие внутри цикла ветвящееся и для разных условий разную операцию надо делать?[/quote:1ntemu9c]

    я за читабельность прежде всего, а уж потом за крутость и новомодность.
    В данном примере я бы точно в линк Where вынесла условие
    if (rowVendor.Type == TAccpacExport.VendorCustomerType.ClientDivision && !rowVendor.Confirmed)

    а вот то что делается внутри — по обстоятельствам. Если всякие ифы, то в фориче или подобном (ну или вызов другого метода, тогда можно без форич ).
    А если простое действие, то не обязательно здесь же енумерировать- но нужно еще учесть как это использоваться (и енумерироваьтся ) будет. Кароче, it depends как обычно

  27. [quote="Ghost":2bitqtn9]
    надо переписать цикл «красиво, просто, компактно и понятно» на LINQ; и надо ли?

    а если условие внутри цикла ветвящееся и для разных условий разную операцию надо делать?[/quote:2bitqtn9]

    ужас
    компактность позволяет избежать всяких boiler-plate code
    а если внутри цикла чего-то там вервится — просто напишешь разные условия и разные операции; такое ветвление — это прямой кандидат на extract method

    var conditions = vendors.Table
    .Where(r => r.Type == TAccpacExport.VendorCustomerType.ClientDivision)
    .Where(r => !r.Confirmed);

    var selectedStrings = conditions
    .Select(r => string.Format(«Vendor {0} must be Confirmed for the export.», r.VendorNumber))

    messages.AddRange(selectedStrings);

  28. [quote="Ghost":cwnbcc9h]
    ok, простой пример из реальной жизни, есть код

    надо переписать «красиво, просто, компактно и понятно» на LINQ; и надо ли?

    а если условие внутри цикла ветвящееся и для разных условий разную операцию надо делать?[/quote:cwnbcc9h]
    прелесть идея. спасибо.

  29. [quote="loco":2aglb3mi]компактность позволяет избежать всяких boiler-plate code
    а если внутри цикла чего-то там вервится — просто напишешь разные условия и разные операции; такое ветвление — это прямой кандидат на extract method

    var conditions = vendors.Table
    .Where(r => r.Type == TAccpacExport.VendorCustomerType.ClientDivision)
    .Where(r => !r.Confirmed);

    var selectedStrings = conditions
    .Select(r => string.Format(«Vendor {0} must be Confirmed for the export.», r.VendorNumber))

    messages.AddRange(selectedStrings);[/quote:2aglb3mi] ну ок :good: сильно компактнее не стало, но стало лучше разделена логика (и добавился оверхед от linq)

    а как вызывать нужный метод вместо складывания стрингов в список если там нужна логика сложнее? не нашел красивых примеров

    [code:2aglb3mi]TAPVendors apVendors = new TAPVendors();
    foreach (AccpacVendorsDataSet.AccpacVendorsRow rowVendor in vendors.Table) {
    apVendors.add(rowVendor);
    rowVendor.ExportStatus = TAccpacExport.Status.Exported;
    }[/code:2aglb3mi]

  30. [quote="Ghost":3kmxbhxw]ну ок :good: сильно компактнее не стало, но стало лучше разделена логика (и добавился оверхед от linq)[/quote:3kmxbhxw]

    какой оверхед, о чем ты?
    Единственный оверхед — это некоторая нагрузка на стек из-за chaining

    Стало не компактнее, стало легче читать.

    [quote="Ghost":3kmxbhxw]
    а как вызывать нужный метод вместо складывания стрингов в список если там нужна логика сложнее? не нашел красивых примеров

    [code:3kmxbhxw]TAPVendors apVendors = new TAPVendors();
    foreach (AccpacVendorsDataSet.AccpacVendorsRow rowVendor in vendors.Table) {
    apVendors.add(rowVendor);
    rowVendor.ExportStatus = TAccpacExport.Status.Exported;
    }[/code:3kmxbhxw][/quote:3kmxbhxw]

    Я ж сказал, если у тебя там логика меняется, это однозначный кандидат на refactoring.
    На каждый случай — свое решение, выделенное в отдельный метод, или, что правильнее, класс

    [code:3kmxbhxw]private AccpacVendorsDataSet.AccpacVendorsRow PerfomComplexLogic(AccpacVendorsDataSet.AccpacVendorsRow row)
    {
    row.ExportStatus = TAccpacExport.Status.Exported;
    return row;
    }

    var selected = conditions.Select(r => PerfomComplexLogic(r))
    apVendors.AddRange(selected);[/code:3kmxbhxw]

  31. [quote="loco":2kon9a1u][code:2kon9a1u]private AccpacVendorsDataSet.AccpacVendorsRow PerfomComplexLogic(AccpacVendorsDataSet.AccpacVendorsRow row)
    {
    row.ExportStatus = TAccpacExport.Status.Exported;
    return row;
    }

    var selected = conditions.Select(r => PerfomComplexLogic(r))
    apVendors.AddRange(selected);[/code:2kon9a1u][/quote:2kon9a1u]

    кстати, а как узнать сколько ентриз в selected получилось? selected.Count() нету (by design), получается надо еще раз по селектед пробежаться, чтобы посчитать.

    что мне не нравится во всей этой лабуде, так это то, что создаются промежуточные списки; хотя список референсов не биг дил опять же, найденные объекты же не клонируются, пральна?

    может дело привычки, перестать думать циклами, а думать списками :)

    а так можно?:

    [code:2kon9a1u]private AccpacVendorsDataSet.AccpacVendorsRow postVendor(AccpacVendorsDataSet.AccpacVendorsRow row)
    {
    apVendors.Add(row);
    row.ExportStatus = TAccpacExport.Status.Exported;
    return row; //а не возвращать ничего можно для селекта?
    }

    conditions.Select(r => postVendor(r));[/code:2kon9a1u]
    а не возвращать ничего из функции можно для селекта?

  32. [quote="Ghost":3jm7r9ip]
    кстати, а как узнать сколько ентриз в selected получилось? selected.Count() нету (by design), получается надо еще раз по селектед пробежаться, чтобы посчитать.
    [/quote:3jm7r9ip]

    Ну, нету
    Есть, только это вызовет енумерацию, т.е. пробег по

    [quote="Ghost":3jm7r9ip]
    что мне не нравится во всей этой лабуде, так это то, что создаются промежуточные списки; хотя список референсов не биг дил опять же, найденные объекты же не клонируются, пральна?
    [/quote:3jm7r9ip]

    Не, какие списки, ты чего
    Это ж функциональщина, ничего не создается и не запускается, просто декларируются функции отбора
    типа, var c = arr.Where(x => x != null); c — это функция, которая будет использоваться про отборе элементов из списка arr(какие брать, какие нет)
    А вот когда ты вызовешь arr.AddRange(c) или там c.ToList() — вот тогда-то и будет совершен пробег и будet создан лист

    [quote="Ghost":3jm7r9ip]
    а так можно?:

    [code:3jm7r9ip]private AccpacVendorsDataSet.AccpacVendorsRow postVendor(AccpacVendorsDataSet.AccpacVendorsRow row)
    {
    apVendors.Add(row);
    row.ExportStatus = TAccpacExport.Status.Exported;
    return row; //а не возвращать ничего можно для селекта?
    }

    conditions.Select(r => postVendor(r));[/code:3jm7r9ip]
    а не возвращать ничего из функции можно для селекта?[/quote:3jm7r9ip]

    не, функция, которую исполняет select, должна возвращать значение
    можно, конечно, но смысл? селект не создаст лист, это просто функция, которая при енумерации(при вызове GetEnumerator) для каждого r(of AccpacVendorsRow) в массиве table будет возвращать некий обьект(в нашем случае тот же AccpacVendorsRow) формируя новый список.

    t.e.
    [code:3jm7r9ip]var selectFunc = table.Where(x => x != null).Select(x => {x.SomeProp = someVal; return x;}); //> oобьявление функции для отбора
    var filteredList = selectFunc.ToList(); //> ‘foreach’
    [/code:3jm7r9ip]
    аналог

    [code:3jm7r9ip]Func<AccpacVendorsRow,AccpacVendorsRow> selectFunc = row => //> oбьявление функции для отбора
    {
    if(row != null)
    {
    row.SomeProp = someval;
    }

    return row;
    }

    filteredList = new List;
    foreach(var r in table) // > ‘foreach’
    {
    var row = selectFunc(r);
    if(row == null)
    continue;

    filteredList.Add(row);
    }[/code:3jm7r9ip]

  33. [quote="Algo":2a2ophn9][quote="Ghost":2a2ophn9]капец, как сильно я не понимаю linq :s1: :s14:
    спасибо, стало легче[/quote:2a2ophn9]
    купи решарпер по скидке
    http://www.jetbrains.com/resharper/buy/index.jsp
    и станет сильно лучше.[/quote:2a2ophn9]

    пока не поймешь, что это все функции, решарпер не поможет
    хотя потом — очень полезная штука

  34. [quote="loco":2ba2ky5d][quote="Algo":2ba2ky5d][quote="Ghost":2ba2ky5d]капец, как сильно я не понимаю linq :s1: :s14:
    спасибо, стало легче[/quote:2ba2ky5d]
    купи решарпер по скидке
    http://www.jetbrains.com/resharper/buy/index.jsp
    и станет сильно лучше.[/quote:2ba2ky5d]

    пока не поймешь, что это все функции, решарпер не поможет
    хотя потом — очень полезная штука[/quote:2ba2ky5d] так это ты уже обьяснил. А решарпер очень наглядно помогает переходить от форичей к експрешенам. А уж потом и деревья не страшны

  35. так что, с этими IEnumerable/IQueryable вообще забыть про foreach?
    просто хочу понять как далеко с этим можно уйти :)

    Например, берем прямо из [url=http://msdn.microsoft.com/en-us/library/cc161164.aspx#_Toc188851308:29ygzsib]MSDN[/url:29ygzsib] вложенный цикл, это можно переписать под LINQ красиво? (а Лепину будут тесты :) )

    [code:29ygzsib]// Loop through customers and print out orders since January 1, 1998

    foreach (Customers customer in q)

    {

    Console.WriteLine(customer.CompanyName + ": " );

    // Note line below to explicitly load all orders for each customer

    customer.Orders.Load();

    foreach (Orders order in customer.Orders.Where(o => o.OrderDate > new DateTime(1998, 1, 1)))

    {

    Console.WriteLine("\t{0},{1}", order.OrderID, order.OrderDate);

    }

    }[/code:29ygzsib]

  36. (из рассмотренного, для наглядности еще раз)

    было:
    [code:33rlzb92]foreach (AccpacVendorsDataSet.AccpacVendorsRow rowVendor in vendors.Table) {
    if (rowVendor.Type == TAccpacExport.VendorCustomerType.ClientDivision &&
    !rowVendor.Confirmed)
    {
    messages.Add("Vendor " + rowVendor.VendorNumber + " must be Confirmed for the export.");
    }
    }
    [/code:33rlzb92]

    стало:
    [code:33rlzb92]
    var errorMessages = vendors.Table
    .Where(r => r.Type == TAccpacExport.VendorCustomerType.ClientDivision)
    .Where(r => !r.Confirmed)
    .Select(r => new TMessage(string.Format("Vendor {0} must be Confirmed for the export.", r.VendorNumber)));
    messages.AddRange(errorMessages);[/code:33rlzb92]

    бутифул! :)

  37. [quote="Algo":3rzgl4k1][quote="loco":3rzgl4k1][quote="Algo":3rzgl4k1][quote="Ghost":3rzgl4k1]капец, как сильно я не понимаю linq :s1: :s14:
    спасибо, стало легче[/quote:3rzgl4k1]
    купи решарпер по скидке
    http://www.jetbrains.com/resharper/buy/index.jsp
    и станет сильно лучше.[/quote:3rzgl4k1]

    пока не поймешь, что это все функции, решарпер не поможет
    хотя потом — очень полезная штука[/quote:3rzgl4k1] так это ты уже обьяснил. А решарпер очень наглядно помогает переходить от форичей к експрешенам. А уж потом и деревья не страшны[/quote:3rzgl4k1]

    лучше ручками писать:)
    Ну, кроме join!

  38. [quote="loco":3k9f0dph]
    лучше ручками писать:)
    Ну, кроме join![/quote:3k9f0dph]
    ну так напишешь, а он поправит, как лучше. Постепенно привыкаешь сразу ручками правильно писать. Ясное дело можно без него, я про упрощение жизни

  39. [quote="Ghost":33m79lsm]так что, с этими IEnumerable/IQueryable вообще забыть про foreach?
    просто хочу понять как далеко с этим можно уйти :)

    Например, берем прямо из [url=http://msdn.microsoft.com/en-us/library/cc161164.aspx#_Toc188851308:33m79lsm]MSDN[/url:33m79lsm] вложенный цикл, это можно переписать под LINQ красиво? (а Лепину будут тесты :) )

    [code:33m79lsm]// Loop through customers and print out orders since January 1, 1998

    foreach (Customers customer in q)

    {

    Console.WriteLine(customer.CompanyName + ": " );

    // Note line below to explicitly load all orders for each customer

    customer.Orders.Load();

    foreach (Orders order in customer.Orders.Where(o => o.OrderDate > new DateTime(1998, 1, 1)))

    {

    Console.WriteLine("\t{0},{1}", order.OrderID, order.OrderDate);

    }

    }[/code:33m79lsm][/quote:33m79lsm]

    тут проблема что ентити используется, так что переписать на один линк запрос с джоином может быть неправильно, потому что неоптимально из базы прочитает. так что надо профайлером или подобным смотреть, что в итоге надевелопится.

  40. [quote="Ghost":19of23nc]а не возвращать ничего из функции можно для селекта?[/quote:19of23nc]

    вот, нашел что хотел:

    [code:19of23nc]vendorsList.ToList().ForEach(x => apVendors.add(x));[/code:19of23nc]

    здесь метод add() не обязан возвращать тот же тип в отличие от select-a.

  41. [quote="Ghost":3lua9t80][quote="Ghost":3lua9t80]а не возвращать ничего из функции можно для селекта?[/quote:3lua9t80]

    вот, нашел что хотел:

    [code:3lua9t80]vendorsList.ToList().ForEach(x => apVendors.add(x));[/code:3lua9t80]

    здесь метод add() не обязан возвращать тот же тип в отличие от select-a.[/quote:3lua9t80]
    ну надо учитывать, что сначала ToList все енумерирует, а потом еще раз по списку вызывается ForEach. Не айс на мой взгляд, но все зависит…

Ответить