2013-05-02 2 views
0

У меня есть этот класс:Как перемещать следующий/предыдущий в списке с помощью LINQ?

public class City 
{ 
    public City() 
    { 
     // 
     // TODO: Add constructor logic here 
     // 
    } 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Image { get; set; } 
} 

и это мой список:

List<City> list = new List<City>(){ 
new City{Id=1,Title="city1",Description=""}, 
new City{Id=2,Title="city2",Description=""}, 
new City{Id=3,Title="city3",Description=""}, 
new City{Id=4,Title="city4",Description=""} 

} 

Как я могу переместить следующий или предыдущий двигаться в моем списке с помощью LINQ?

+1

Что вы подразумеваете под 'move'? Вы хотите изменить порядок позиций? Или вы хотите изменить элемент, который вы просматриваете? – pyrocumulus

+0

Что вы имеете в виду, переместив следующий или переместив предыдущий? –

+0

Возможно, Skip (1) делает то, что вы называете move next? Не уверен, что есть что-то другое, поскольку Linq - это расширения для IEnumerable. –

ответ

7

Вы хотите ElementAt, это логически эквивалентно использованию свойства список индексатор и потенциально гораздо быстрее, чем при использовании Пропустить & Take во время выполнения, поскольку он содержит определенную проверку, чтобы увидеть, если последовательность реализует IList, если так оно использует индексатор , если бы не она перебирает последовательность (аналогично делать Skip(n).Take(1))

var nameList = List<string>{"Homer", "Marge", "Bart", "Lisa", "Maggie"}; 
IEnumerable<string> nameSequence = nameList; 

secondFromList = nameList[1]; 
secondFromSequence = nameSequence.ElemenetAt(1); 

Надеется, что это достаточно ясно.

NB: IList осуществляется всеми видами коллекций, массивы и т.д., не только List<>

2

Ваш вопрос:

Как я могу переместить следующий или предыдущий двигаться в моем списке с помощью LINQ?

и ваш комментарий на @ mattytommo (ныне удален) ответ

, например, у меня есть две кнопки (следующий/предварительно), когда я нажимаю на следующий я хочу увидеть следующий элемент в списке и. ..

LINQ - это не тот подходящий инструмент для этой вакансии. LINQ предназначен для работы с коллекциями и позволяет быстро фильтровать и выбирать определенные элементы и возвращать отдельную коллекцию. Он не предназначен для просмотра определенного объекта, а затем позволяет перейти к следующему. Это намного мощнее, но есть гораздо лучшие инструменты и методы для достижения того, чего вы хотите.

Одна идея была бы просто сохранить текущую позицию и вызвать метод, чтобы вернуться на следующий элемент в коллекции:

private int currentPosition = 1; 

public City SelectNextCity() 
{ 
    currentPosition++; 
    return list[currentPosition]; 
    // in this context `list` would be a class-level field. 
} 

Это очень грубый пример. Если бы вы действительно реализовали это, вам нужно будет добавить некоторые проверки индексов, чтобы убедиться, чтосуществует в коллекции до его вызова.

5

Не совсем LINQ, но я хотел бы предложить что-то вроде:

List<City> cityList; 
public City Next(City current) 
{ 
    int index = cityList.IndexOf(current); 

    if (index < cityList.Count - 1) 
     return cityList.ElementAt(index + 1); 
    return current; 
} 

public City Previous(City current) 
{ 
    int index = cityList.IndexOf(current); 

    if (index >= 1) 
     return cityList.ElementAt(index - 1); 
    return current; 
} 

И начиная с cityList.First().

Редактировать: Я должен согласиться с другими, заявив, что LINQ определенно является неправильным инструментом для этой работы. Если это не абсолютное требование, просто используйте регулярную индексацию для этой проблемы. LINQ фактически делает решение намного сложнее, чем должно быть.

3

Это не цель Linq манипулировать объект, как вы хотите (см ответа psubsee2003 в)

Но если вы хотите (если у вас есть, с ружьем на голове):

public City GetNext(City actual) 
    { 
     return list.Skip(list.IndexOf(actual) + 1).Take(1).FirstOrDefault(); 
    } 
+1

Лучший ответ и точно такая штука linq была разработана для imo –

3

Метод расширения ответа @ Xaruth

public static T NextIf<T>(this IEnumerable<T> source, T current) 
{ 
    var list = source.ToList(); 
    return list.Skip(list.IndexOf(current) + 1).Take(1).FirstOrDefault(); 
}