[C#, Этюд] SortedSet
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.07.10 16:59
Оценка:
using System.Collections.Generic;

public class C
{
    public static bool Foo(string x, string y)
    {
        var s = new SortedSet<string>();
        s.Add(x);
        return x.Length != y.Length && s.Contains(y);
    }
}


Может ли метод Foo вернуть true?
(класс System.Collections.Generic.SortedSet<T> стандартный, из System.dll)
Re: [C#, Этюд] SortedSet
От: Пельмешко Россия blog
Дата: 19.07.10 17:16
Оценка: 57 (5)
Здравствуйте, nikov, Вы писали:

N>
N>using System.Collections.Generic;

N>public class C
N>{
N>    public static bool Foo(string x, string y)
N>    {
N>        var s = new SortedSet<string>();
N>        s.Add(x);
N>        return x.Length != y.Length && s.Contains(y);
N>    }
N>}
N>


N>Может ли метод Foo вернуть true?


Легко:
Foo("abc", "abc\0\0");

Корень зла?
Console.WriteLine("abc".CompareTo("abc\0\0"));

Давненько поигрался с Pex, он сломал половину моего кода понапихав \0 в строки, сейчас легко было догадаться
Re: [C#, Этюд] SortedSet
От: _FRED_ Россия
Дата: 19.07.10 17:24
Оценка: 8 (1) +1
Здравствуйте, nikov, Вы писали:

N>using System.Collections.Generic;

N>public class C
N>{
N>    public static bool Foo(string x, string y)
N>    {
N>        var s = new SortedSet<string>();
N>        s.Add(x);
N>        return x.Length != y.Length && s.Contains(y);
N>    }
N>}


N>Может ли метод Foo вернуть true?

N>(класс System.Collections.Generic.SortedSet<T> стандартный, из System.dll)

Конечно: дефолтовый компаратор культурозависимый (используется текущая культура). String::Length возвращает "физическое" число символов, а культура может посчитать, что некоторая последовательность символов равна одному символу.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: [C#, Этюд] SortedSet
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.07.10 17:24
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Легко:

П>
П>Foo("abc", "abc\0\0");
П>


Отлично! А можешь найти пример со строками, не содержащими '\0'?
Re: [C#, Этюд] SortedSet
От: Caracrist http://1pwd.org/
Дата: 19.07.10 20:24
Оценка: 24 (1)
Здравствуйте, nikov, Вы писали:

N>
N>using System.Collections.Generic;

N>public class C
N>{
N>    public static bool Foo(string x, string y)
N>    {
N>        var s = new SortedSet<string>();
N>        s.Add(x);
N>        return x.Length != y.Length && s.Contains(y);
N>    }
N>}
N>


N>Может ли метод Foo вернуть true?

N>(класс System.Collections.Generic.SortedSet<T> стандартный, из System.dll)

совсем злостный хакк
        [StructLayout(LayoutKind.Explicit)]
        struct ArrayConvert
        {
            [FieldOffset(0)]
            public string str;
            [FieldOffset(0)] 
            public int[] arr;
        }
        static void Main(string[] args)
        {
            ArrayConvert ac = new ArrayConvert();
            ac.str = "fignya";
            unsafe
            {
               fixed (int* ptr1 = ac.arr)
               {
                   --*(ptr1 - 1);
               }
            }
            Console.WriteLine(Foo("fignya",ac.str));
        }

~~~~~
~lol~~
~~~ Cracked Minds (головоломки)
Re[2]: [C#, Этюд] SortedSet
От: Muxa  
Дата: 19.07.10 20:51
Оценка:
вот с этого места --*(ptr1 — 1) поподробнее пожалуйста. что произошло? и как это повлияло на длину твоей фигни (ac.str)?
Re[3]: [C#, Этюд] SortedSet
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 19.07.10 20:53
Оценка: 7 (2)
Здравствуйте, Muxa, Вы писали:

M>вот с этого места --*(ptr1 — 1) поподробнее пожалуйста. что произошло? и как это повлияло на длину твоей фигни (ac.str)?


Видим, в .NET в качестве строкового формата используется BSTR — в нем длина хранится перед указателем на начало строки.
Re[3]: [C#, Этюд] SortedSet
От: andy1618 Россия  
Дата: 20.07.10 00:07
Оценка:
Здравствуйте, nikov, Вы писали:

N>Отлично! А можешь найти пример со строками, не содержащими '\0'?


В моей локали (французский+русский) прокатывает:
string s1 = "ae";
string s2 = ((char)230).ToString();  // "æ"
Console.WriteLine(s1.CompareTo(s2)); // returns 0
Re: [C#, Этюд] SortedSet
От: _FRED_ Россия
Дата: 20.07.10 07:21
Оценка: +1 :)
Здравствуйте, nikov, Вы писали:

N>        var s = new SortedSet<string>();

N>Может ли метод Foo вернуть true?
N>(класс System.Collections.Generic.SortedSet<T> стандартный, из System.dll)

Интересно, что EqualityComparer<string>.Default будет "правильным", всмысле сравнение пойдёт по правилу Ordinal, что приводит к интересному [парадоксальному!] результату:
str1.Equals(str2) != (str1.CompareTo(str2) == 0)

Какое поле для творчества тестировщикам!
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.