2013-04-24 4 views
1

나는 List<T>이 있으며 하단에서 추가하기를 원하지만 런타임을 얻고 싶습니다. IndexOutOfBoundsException.C# 목록 - 목록 맨 아래에 추가

List<ClassA> ClassesOfA = new List<ClassA>(10); 
... 
... 
ClassesOfA[5] = classAObj; 
... 

이렇게 거기다 :

나는 용량 목록을 초기화 한?

아래에서 다른 목록을 분석하고이 목록에 결과를 추가하기 때문에이 작업을 수행해야합니다. 그래서 나는 바닥에서 추가 할 수 있어야합니다. 개체를 추가하기 전에 개체를 ClassA 개체로 초기화하는 대신이 작업을 수행 할 수 있습니까?

+2

어쩌면 그것은 당신이 찾고있는'Stack'입니다 – I4V

+1

하단에서부터 위로부터 다른리스트를 분석해 보시지 않겠습니까? 위치는 상대적입니다. – Richard

+3

용량을 기본값으로 설정해도 목록이 항목으로 미리 채워지지 않습니다. 목록 크기 또는 좋은 초기 크기를 알게 된 경우 목록 크기 조정을 저장하기 위해 현재 메모리 블록을 설정합니다. –

답변

2

: 두 번째 목록은 처리하고 첫 번째 목록에 비해 같은 수의 원소를 가질 경우

+1

더 나은 옵션은 새 목록에 항목을 추가 할 때 역순으로 원래 목록을 반복하는 것입니다. 그러면 전화가 거꾸로됩니다. –

+1

@JustinNiessner 참고 : List.Reverse가 아니라 LINQ'Reverse'를 사용하면 그냥 그렇게 할 것이므로 list.AsEnumerable(). Reverse() 만하면됩니다. – Servy

+0

@macrosoaie 감사합니다. 나는 그 반대의 방법을 생각하지 않았다. 이것은 나를 위해 일할 수 있습니다. – madu

7

목록에 항목을 추가하려면 ClassesOfA.Add()으로 전화해야합니다. 이 방법으로 추가 된 항목은 목록의 끝 부분에 추가됩니다 (목록의 시작 부분 또는 목록의 끝 부분이 사용자가 하단 부분인지 여부는 확실하지 않음). 당신은 추가 시도 할 수

var myArray = new ClassA[listA.Count]; 
for (int i = 0; i < listA.Count; ++i) myArray[i] = Process(listA[i]); 
+1

이것이 맞지만, OP가 'Capacity'생성자 오버로드의 관점에서 혼란 스럽습니다. –

1

, 나는 당신이 사용하고자하는 것은 단지 배열처럼 생각 다음과 같은 요소 : ClassesOfA.Add(classAObj)이면 모든 목록 요소가 추가되면 ClassesOfA.Reverse()을 호출하여 목록 안의 개체 순서를 바꿀 수 있습니다.

+0

그리스도 ..'새로운 목록 (otherIEnumerableOfX)'을 보지 못하셨습니까? 또는'otherListOfX.ToArray()'메쏘드? – quetzalcoatl

+0

그게 어떤 관련이 있습니까? 물론 여러 가지 방법으로이 작업을 수행 할 수 있습니다. var myArray = listA.Select (Process) .ToArray와 같은 linq를 사용할 수도 있습니다. 그러나 me –

+0

negscore가 제거되었습니다. Process() 호출을 인식하지 못했습니다. 그것은 적어도 약간의 의미가 있습니다. 만약 내가 알아 차 렸더니, 나는 매우 Select를 제안 할 것이다. :) Less chars = less less = 적은 에러. 덜 chars = 덜 읽기 = 쉬운 mainterance. 그냥. – quetzalcoatl

1

또한, 바람직하게는,이 목록을 유지하고 끝 부분을 연결하여 :

당신이 필요합니다 : 당신이 정말 당신이 제안하는 경로를 이동하려는 경우,

var firstList = new List<ClassA>(); 
var secondList = new List<ClassA>(); 

// Fill the lists. 

return firstList.Concat(secondList).ToList(); // using System.Linq; 


그러나 공간을 "예약"하기 위해 필요한만큼의 null 항목을 추가하십시오.

var list = new List<ClassA>(10); 
list.AddRange(new ClassA[5]); 

// Or... 
var list = Enumerable.Repeat<ClassA>(null, 5).ToList(); 

이제 Add 색인 5 이후 항목 :

list.Add(new ClassA()); 

용량은 많은 항목으로 목록을 미리 채우지 않습니다. 처음 5 개를 비워두기를 원한다면, 내가 볼 수있는 것만 큼 좋을 것입니다.

추가는이 시점부터 목록의 맨 아래에 항목을 추가합니다. 이런 식으로 왜 그렇게하고 싶어하는지 확신 할 수 없습니다.

+0

1024 개의 null을 삽입하기 위해 1024 개의 요소 배열을 만드는 이유는 무엇입니까? :) 그러나, 나는 인정한다, 아주 작은 조사를 위해 그것은 매우 간단하다. 아직도. Enumerable 을 사용할 것입니다. 반복 (5) – quetzalcoatl

+0

@quetzalcoatl 글쎄, 처음에는 5입니다. 방금 배열이 각 요소를 기본값으로 설정할 때 배열 구문을 사용했습니다. 이는 필요한 것으로 보입니다. –

+0

나는 IRC 기반의 특성을 가지고 있으며, 일반적으로 한 문장 씩 빠른 '엔터'를 누릅니다. 그동안 당신은 당신의 글을 썼고 나는 그 글을 끝내고 있습니다. 물론 오타가 도처에 있으므로 Enumerable이어야합니다. 반복 (x, 5)하지만 분명합니다. 나는 작은 시간/메모리 이점을 낭비하기 위해 수동으로 맞춤형 Capacity를 사용하는 것은 비이성적이라고 지적하고 싶었습니다. 쓸모없는 배열을 만들어서 :) 당신은 상관하지 않거나 그렇지 않습니다. 용량을 남겨 두지 않으면 적응 시키십시오. 당신이 돌보는 경우 : ** 걱정 **. 사소한 일이지만 나중에 누군가를 오도하게 만드는 것은 논리의 모순입니다. – quetzalcoatl

관련 문제