1. C# / Говнокод #19566

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    bool compareArrays(int[] a,int[] b)
    	{
    		if(a.Length != b.Length)
    			return false;
    
    		for(int i = 0;i<a.Length;i++)
    			if(a[i] != b[i])
    				return false;
    
    		return true;
    	}

    Нобелевская премия по программированию

    Запостил: d_fomenok, 02 Марта 2016

    Комментарии (28) RSS

    • А в чём ГК?
      Ответить
      • Arrays.equals()

        P.S. Ой бля, это же c#... Но ведь там тоже есть подобный хелпер? Только не говорите, что его нет...
        Ответить
        • public static bool SequenceEqual<TSource>(
          	this IEnumerable<TSource> first,
          	IEnumerable<TSource> second
          )
          Ответить
          • Т.е. a.SequenceEqual(b)?
            Ответить
            • угу

              можно a.Equals(b); если хочется по ссылке
              Ответить
          • http://www.dotnetperls.com/sequenceequal
            Performance. Methods found in System.Linq usually have worse performance on arrays than custom imperative algorithms. I tested the performance of SequenceEqual because I had nothing better to do. I compared two equal arrays of 32767 elements.
            Result:
            SequenceEqual was more than ten times slower than the imperative algorithm (ArraysEqual).

            Однажды вступил в linq ienumerable.orderby на ~100k элементов массив, вместо Array.Sort
            Ответить
            • Код не мой, я просто разместил объяву.
              Ответить
    • А ты p/invoke memcmp хотел?
      Ответить
    • Хороший, годный код. Как будто сам писал
      Ответить
    • Еще на null нужно проверить. Или не нужно.
      Ответить
      • Зачем? NullReferenceException гораздо интереснее
        Ответить
    • .net 2.0 compatible
      Ответить
    • Ебанул всем плюсца, для баланса.
      Ответить
    • Насколько я понял, код проверяет массивы на идентичность. Что не так, серьёзно?
      Ответить
      • > Что не так
        То, что для этого должна быть стандартная функция. Это ж не сишка, чтобы массивы руками сравнивать.
        Ответить
        • memcmp же
          Ответить
          • memcmp? Она же указатели сравнивает.
            Ответить
            • > Она же указатели сравнивает
              Ну если ты её запустишь на массиве из указателей... то да. А так - она блобы сравнивает.
              Ответить
              • побитово?
                Ответить
              • http://ideone.com/ktuaj2
                Смотрите-ка, действительно указатели сравнивает. Содержимое у строк одинаковое, а указатели разные. memcmp это и показывает!
                Ответить
                • UBожество.
                  Ответить
                  • Этот код станет правильным, если sizeof(char*) заменить на strlen(a) * sizeof(char) ?
                    Ответить
                  • http://ideone.com/guJ52s
                    Вроде пофиксил UB. Всё честно, присваиваем массивам одно и то же, а сравниваются указатели.
                    Ответить
                    • a[3] = __LINE__;
                      b[3] = __LINE__;

                      Ну толсто же.
                      Ответить
                      • Более тонко и без UB не придумал.

                        А вообще, можно ли? На ум идут только псевдослучайные числа, сгенерированные таким образом, что выйдет последовательность вида "42\0042\01" - функция достаточно запутанная (только не знаю, какая), но внешне кажущаяся периодической с периодом sizeof(char*)... Или какая-то математическая питушня вида https://х..р/post/146140/ - a заполняем константами, а b - значением выражений...
                        Ответить

    Добавить комментарий