Расстояние между позицией в списке Ngrams

Мне нужно сделать расстояние между положением элемента в одном списке с тем же элементом в другом списке.

я пробовал что-то вроде этого

 public void out_of_place(List<NgramItem> Test, List<NgramItem> Train)
   {
       List<int> result = new List<int>();
       int indexTest = -1;
       int indexTrain = -1;

           foreach (NgramItem item in Test) {         
           indexTest = Test.IndexOf(item);
           indexTrain = Train.IndexOf(item);                 
           }
           Console.WriteLine(" Index: {0}   {1}", indexTest, indexTrain);

    }

открытый класс NgramItem: IComparable { частная строка ngram; частная частота; // ... }

но я не могу получить индекс элемента в списке Train. Есть ли у кого-нибудь предложение?

Спасибо


c#
person Traca    schedule 04.06.2011    source источник
comment
Это тот же объект или просто тот же идентификатор?   -  person Oskar Kjellin    schedule 04.06.2011
comment
Не могли бы вы показать нам больше кода и предоставить дополнительную информацию? Что такое NgramItem? Как определяются Test и Train и как они заполняются? Кажется, в коде, который вы разместили, нет ничего плохого. Что возвращает Train.IndexOf()?   -  person svick    schedule 04.06.2011
comment
NgramItem — это класс с частотой ngram(word) e. test и train находятся в List‹NgramItem›, и они заполнены. indexOf() дает вам индекс определенного элемента коллекции   -  person Traca    schedule 04.06.2011


Ответы (1)


Вы не предоставили никаких подробностей об используемом типе коллекции или NgramItem. Однако вполне вероятно, что при выполнении Train.IndexOf(item) для ссылочных типов будет использоваться Equals по умолчанию, а именно ReferenceEquals. Если экземпляры не являются общими в двух коллекциях, IndexOf всегда будет возвращать -1, поскольку экземпляры Test не хранятся в Train.

Решение состоит в том, чтобы реализовать Equals на NgramItem, чтобы определить, представляют ли два экземпляра NgramItem одно и то же значение. Помните, что если вы переопределяете Equals, вы также должны переопределять GetHashCode.

person Martin Liversage    schedule 04.06.2011
comment
NgramItem — это объект, определенный мной. Вы можете видеть это как слова и частоту слова. Идея состоит в том, чтобы вычислить для каждого слова из Test его расстояние от того же слова в списке Train. Пример: Test = A B C D Train = D C A B. Расстояние будет примерно таким: 2 2 1 3. - person Traca; 04.06.2011
comment
Мартин, ты прав, я просто получаю -1 от индекса поезда. Я попытаюсь реализовать Equals. - person Traca; 04.06.2011
comment
Я попробовал ваше решение, но оно все еще не работает... Все равно спасибо. - person Traca; 05.06.2011
comment
Советы по модульному тестированию: создайте два одинаковых экземпляра a и b из NgramItem. Убедитесь, что a.Equals(b) возвращает значение true. Затем добавьте b в коллекцию c и убедитесь, что c.IndexOf(a) возвращает неотрицательное число. - person Martin Liversage; 05.06.2011