2014-01-22 4 views
0

Можно ли заблокировать набор списка со значением после определенного индекса, быстро?Назначение списка с одним значением после индекса

Как приведенная ниже логика может быть написана на C# ?. Я мог бы использовать другую коллекцию, если я могу сделать то же самое.

List<int> mylist = new List<int>(10); 

int index = 3; 
int value = 11; 
mylist.SetValuesafterIndex(index, value); 

EDIT:

Разъяснение: Я имею в виду, я хочу, индексы 3 до 9 включительно, чтобы быть присвоено значение 11

+0

@ DavidHeffernan-да, абсолютно – Jimmy

+0

Изменено вопрос. Я все еще думаю, что первая строка была тихой, о том, чего я хочу. – Jimmy

+0

Не совсем. 'SetValueAfterIndex' может звучать так, как будто вы хотите изменить один элемент после указанного индекса. –

ответ

1

Метод, который вы хотите, не предоставляется List<T>. Таким образом, в то время как это что-то заявление очевидного, вы могли бы отлично написать:

for (int i = index; i < list.Count; i++) 
    list[i] = value; 

Единственный вариант, который приходит на ум, является использование RemoveRange, чтобы удалить все элементы из Index до конца, а затем звоните AddRange, чтобы добавить новые значения.

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

+0

Вы правы, это утверждение очевидного – Jimmy

+0

Я склонен согласиться. RemoveRange и AddRange выглядит как единственный вариант. Подождем еще какое-то время для любых магических идей :-). – Jimmy

+0

Я подозреваю, что будут сценарии, в которых цикл 'for' будет быстрее, и другие сценарии, где альтернатива быстрее. –

0

Попробуйте следующее

mylist[index] = value; 

Неясно, если вы хотите оно должно быть в index или index + 1. Просто настроить выше по мере необходимости

+0

Я хочу, чтобы «блок» был установлен после индекса для размера списка. – Jimmy

+1

@Jimmy, что такое блок? – JaredPar

+0

Задайте все элементы в списке после индекса до заданного значения. Например, если размер списка равен 10, я хочу установить все значения после индекса 3 (индексы 3-9) до заданного значения. – Jimmy

0

Вы можете написать общий метод, как это:

static void SetRangeValues<T>(List<T> list,int start,int end,T value) 
{ 
     if(end > list.Count() || start < 0) 
      throw new ArgumentOutOfRangeException(); 

     for(int i=start;i<end;i++) 
     { 
      list[i] = value; 
     } 
} 

И вы можете использовать его как это:

var list = new List<int>(); 
list.AddRange(Enumerable.Range(0,10)); 

Console.WriteLine("Before: "); 
list.ForEach(Console.WriteLine); 

SetRangeValues(ref list, 3, 10, 2000); 

Console.WriteLine("After: "); 
list.ForEach(Console.WriteLine); 

// Output: 

Before: 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
After: 
0 
1 
2 
2000 
2000 
2000 
2000 
2000 
2000 
2000 

Если вы хотите, чтобы установить значения до конца из списка, просто вы можете передать list.Count в качестве end параметра:

SetRangeValues(list, 3, list.Count(), 2000); 
+0

Это немного бессмысленное тестирование и сброс 'ArgumentOutOfRangeException', если' List 'уже делает это. Вы можете также позволить ему выполнять работу и, таким образом, выполнить еще одну проверку. –

+0

@DavidHeffernan вы правы, но, возможно, OP хочет изменить это поведение, возможно, он хочет отобразить сообщение и немедленно вернуться из функции. –

0

Не уверен о производительности, но одна линия ответ может быть:

myList.AddRange(Enumerable.Repeat(0, index).Concat(Enumerable.Repeat(value, 10 - index))); 
+0

Но значения в списке перед индексом нельзя отбрасывать. – Jimmy

+0

Это список int, значение перед индексом должно быть инициализировано перед дальнейшей обработкой. – Lowkey

Смежные вопросы