2015-06-12 2 views
3

Я хочу вернуть элементы между двумя переменными индексами в списке.Возвращаемые элементы между двумя переменными индексами в списке

Например, если этот список -

List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

Я хочу, чтобы цикл по списку с помощью переменных для значений индекса. Назовем значения индекса X и Y. Итак, если X равно значению индекса 0, а Y равно значению 5, мне нужно пройти через индекс 0-5 и вернуть все значения элементов. X и Y впоследствии могут стать индексами от 5 до 8, например. Как бы это сделать?

+1

по заданные индексы списка или значения списка? –

+2

В чем конкретно проблема или вопрос? Как бы то ни было, похоже, вы могли просто написать то, что вы описали в C#. –

+0

Извините, О. Карпер, я бы поставил код, но я все еще учился и не знал, как это сделать. –

ответ

5

вы можете использовать List.GetRange

var result = list.GetRange(X, Y-X+1); 

или простой цикл

List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
for (int i = X; i <= Y; i++) 
{ 
    Console.WriteLine(list[i]); 
} 

или изобретать колесо так, как вы хотите

public static class Extensions 
{ 
    public static IEnumerable<T> GetRange<T>(this IList<T> list, int startIndex, int endIndex) 
    { 
     for (int i = startIndex; i <= endIndex; i++) 
     { 
      yield return list[i]; 
     } 
    } 
} 

foreach(var item in list.GetRange(0, 5)) 
{ 
    Console.WriteLine(item); 
} 
+1

Спасибо доктору !!!!! , List.GetRange был тем, что мне было нужно. Я создал новый список List newlist = list.GetRange (X, Y - X + 1); и теперь я могу пройти через этот список, чтобы получить значения элементов, которые именно то, что мне нужно. –

+1

@KevinMoore. Поскольку это был ваш выбранный вами ответ, пожалуйста, отметьте его ответом, используя галочку рядом с ответом. – Mackan

+0

@Mackan, Ха, новый для обмена стоп-книгами..не.Мне понравились все остальные ответы, но GetRange - это прекрасно. Эта форма фантастическая! все Спасибо всем быстрым, отличным ответам. –

6

Вы можете использовать Enumerable.Skip и Enumerable.Take

var res = list.Skip(noOfElementToSkip).Take(noOfElementsToTake); 

Для использования переменной в качестве индексов

var res = list.Skip(x).Take(y-x+1); 

Примечание Вам необходимо пройти индекс начала элемента, чтобы пропустить и для принятия ряда элементов, которые необходимо передать номер элемента, который вы хотите в параметре Take, минус номер элемента запуска, плюс один список - индекс с нулевым значением.

+0

Спасибо за предложение @Mackan, я собирался для этого через ... – Adil

+0

Я имею в виду, что я собираюсь уточнить свой ответ, чтобы дать то, что OP точно хочет, и это то, что вы предложили. – Adil

+1

Я думаю, что это должно быть 'Take (y-x + 1)' – dotctor

2
int x = 0, y = 5; 
List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
for (; x < y; x++) 
{ 
    Console.WriteLine(list[x]); 
} 

Это будет работать, если X всегда меньше, чем Y. Если вы не знаете, что больше добавить это перед циклом:

if (x > y) 
{ 
     x = x^y; 
     y = y^x; 
     x = x^y; 
    } 
+0

upvote только потому, что обменивается :) – Igor

+0

как насчет использования 'Interlocked.Exchange'? – dotctor

1

Другой вариант:

int X = 0, Y = 5; 
Enumerable.Range(X, Y - X + 1) 
.Select(index => list[index]); 
1

Это должно сделать трюк -

 List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

     int startindex = 1; 
     int endIndex = 7; 
     var subList = list.Skip(startindex).Take(endIndex - startindex-1).ToList(); 
Смежные вопросы