none
LINQ Join Объясните работу селектора на примере решения задачи RRS feed

  • Вопрос

  • Даны последовательности положительных целых чисел A и B; все числа в каждой последовательности различны. Найти внутреннее объединение A и B (см. LinqBegin46), пары в котором должны удовлетворять следующему условию: последняя цифра первого элемента пары (из A) должна совпадать с первой цифрой второго элемента пары (из B). Представить найденное объединение в виде последовательности строк, содержащих первый и второй элементы пары, разделенные двоеточием, например, «49:921». Порядок следования пар должен определяться исходным порядком элементов последовательности A, а для равных первых элементов пар — лексикографическим порядком строковых представлений вторых элементов (по возрастанию).

    Я сделал так:

    int[] A = new int[4] { 2, 62, 3, 7};
                int[] B = new int[4] {  88, 52, 12, 4 };

     var q =  A.Join(B, x => x.ToString().First(), y => y % 10, (x, y) => string.Format("{0}:{1}", x, y));

    Но похоже оно не работает, потому что я недостаточно хорошо понял работу Join из того, что написано в msdn. Может есть какие-то статьи про это для начинающих, где более подробно все объяснено?

    9 февраля 2015 г. 16:30

Ответы

  • Добрый день.

    Если коротко, то у вас три проблемы:

    1. Метод First возвращает Char, а, следовательно, сравнивать '6' и 6 бессмысленно. Они не равны. Надо писать вот так:

    var q = A.Join(B, x => x.ToString().First().ToString(), y => (y % 10).ToString(), (x, y) => string.Format("{0}:{1}", x, y));

    2. У вас ни один элемент первой коллекции не стыкуется ни с одним элементом второй коллекции. В первой коллекции последние символы 2, 3, 7, а во второй первые символы 8, 5, 1, 4. Т.е. совпадений нет. Я бы взял для пример:

    int[] A = new int[4] { 2, 62, 3, 7 };
    int[] B = new int[4] { 28, 352, 22, 4 };

    3. Вы перепутали порядок получения ключей. Правильный порядок вот такой:

    var q = A.Join(B, y => (y % 10).ToString(), x => x.ToString().First().ToString(), (x, y) => string.Format("{0}:{1}", x, y));

    Итого:

    Вам осталось разобраться с сортировкой...

    • Помечено в качестве ответа Энтомолог 10 февраля 2015 г. 10:21
    10 февраля 2015 г. 8:07
    Отвечающий

Все ответы

  • Здравствуйте,

    Рассмотрите к примеру данную статью: http://www.dotnetperls.com/join


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    10 февраля 2015 г. 6:43
    Модератор
  • Добрый день.

    Если коротко, то у вас три проблемы:

    1. Метод First возвращает Char, а, следовательно, сравнивать '6' и 6 бессмысленно. Они не равны. Надо писать вот так:

    var q = A.Join(B, x => x.ToString().First().ToString(), y => (y % 10).ToString(), (x, y) => string.Format("{0}:{1}", x, y));

    2. У вас ни один элемент первой коллекции не стыкуется ни с одним элементом второй коллекции. В первой коллекции последние символы 2, 3, 7, а во второй первые символы 8, 5, 1, 4. Т.е. совпадений нет. Я бы взял для пример:

    int[] A = new int[4] { 2, 62, 3, 7 };
    int[] B = new int[4] { 28, 352, 22, 4 };

    3. Вы перепутали порядок получения ключей. Правильный порядок вот такой:

    var q = A.Join(B, y => (y % 10).ToString(), x => x.ToString().First().ToString(), (x, y) => string.Format("{0}:{1}", x, y));

    Итого:

    Вам осталось разобраться с сортировкой...

    • Помечено в качестве ответа Энтомолог 10 февраля 2015 г. 10:21
    10 февраля 2015 г. 8:07
    Отвечающий
  • Порядок следования пар должен определяться исходным порядком элементов последовательности A, а для равных первых элементов пар — лексикографическим порядком строковых представлений вторых элементов (по возрастанию).

    Добрый день! У кого-то есть мысли по поводу того, как осуществить данную сортировку?
    1 декабря 2016 г. 9:08
  • :)

    JustAndre, есть. Если вы столкнулись с проблемой, то опишите в чем ваша она заключается в отдельном топике, покажите что вы уже попробовали, что у вас не получается. И вам постараются помочь.  А так, разберитесь с OrderBy и ThenBy.

    1 декабря 2016 г. 9:20
    Отвечающий