Получить индекс объекта в массиве, тип которого мы не знаем - PullRequest
0 голосов
/ 22 января 2019

Есть список значений типа «книга», и есть объект типа «книга». Тип листа и объекта до выполнения функции неизвестен, только в процессе. При использовании метода «indexOf ()» он дает индекс -1 вместо 3 (проверяется, когда лист и объект жестко типизированы типом «книга»). Традиционно у меня есть голый лист и голый объект, без свойств и переменных. Только после выполнения объекты получают типы и значения. В ходе выполнения. Вот и вся сложность В чем подвох?

//Object with id = 4, has index 3 in the list
obj = Connector.Get(CurrentTable, "WHERE Id = " + id).FirstOrDefault();

//list with 10 records
var list = Connector.Get(CurrentTable, Condition).ToList();

//Need get 3, got -1
var currIndex = list.IndexOf(obj);
var nextIndex = (currIndex < list.Count - 1 ? currIndex : -1) + 1;
var prevIndex = (currIndex > 0 ? currIndex : list.Count) - 1;

ViewBag.NextPost = list[nextIndex];
ViewBag.PrevPost = list[prevIndex];

Ответы [ 2 ]

0 голосов
/ 23 января 2019

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

var list = Connector.Get(CurrentTable, Condition).ToList();

Вы можете ограничить список только объектами типа "книга", например:

var books = list.OfType<book>().ToList();

Фильтрация также отливает, так что вы можете легко сравнить свойства.Если class book имеет свойство Id и вы ищете книгу, которая соответствует obj, вы можете сделать это:

var foundBook = books.First( b => b.Id == obj.Id );
0 голосов
/ 22 января 2019

Сравнивает ссылку на объект.Вы должны сделать что-то кроме прямого равенства.Можете ли вы сравнить свойство Id или что-то еще, чтобы определить, равны ли они?

//Object with id = 4, has index 3 in the list
obj = Connector.Get(CurrentTable, "WHERE Id = " + id).FirstOrDefault();

//list with 10 records
var list = Connector.Get(CurrentTable, Condition).ToList();

var currIndex = list
.Select((a, i) => new {element = a, index = i})
.First(a => a.element.Id == obj.Id)//or some other comparison that you would define as equal
.index;
var nextIndex = (currIndex < list.Count - 1 ? currIndex : -1) + 1;
var prevIndex = (currIndex > 0 ? currIndex : list.Count) - 1;

ViewBag.NextPost = list[nextIndex];
ViewBag.PrevPost = list[prevIndex];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...