2014-10-28 3 views
0

문자열 목록을 반환하는 함수가 있습니다.일반 목록을 배열로 변환하는 이유/이점이 있습니까?

배열처럼 루프를 반복 할 수 있습니다.

이렇게하기 전에 배열로 변환해야하는 이유가 있습니까?

편집 : List (또는 다른 유형)을 사용하여 문자열 컬렉션을 조작/작성하지만 반환 할 때 ToArray를 호출하는 이유는 필자가 온라인에서 (그리고 SO에서) 코드를 보았 기 때문입니다.

+0

아니, 그냥 목록을 반복. –

+0

목록이나 배열을 사용해야 할 때 궁금하지 않습니다. (함수를 추가해야 함) 목록을 사용하고 있는데 왜 배열로 변환해야합니까? – user3542112

+0

배열을 예상하는 메서드에 목록을 전달하는 경우 배열로 변환해야합니다. –

답변

0

특정 용도로 사용해야하는 경우가 아니면 예외가 아닙니다. .NET에서 Out-of-the-Box를 사용하는 것보다 List를 조작/검색하는 데 더 많은 옵션이 있습니다.

메모리에 민감한 응용 프로그램을 작업하는 경우 배열의 메모리 공간이 조금 작아지는 것은 사실이지만 메모리가 응용 프로그램에 매우 중요한 문제가 아니라면 걱정하지 않아도됩니다.

1

이유 중 하나는 원래 목록을 클라이언트 코드에 노출시키지 않는 것입니다. 공개 된 경우 List<T>이 참조 유형이므로 소스 목록을 수정할 반환 된 List<T>에 요소를 추가/제거 할 수 있습니다. 이는 의도 한 동작이 아닐 수 있습니다.

ToArray을 사용하고 대신 배열을 반환하면 배열의 수정에 대해 신경 쓸 필요가 없습니다. 단지 데이터 복사본이기 때문에 걱정하지 않아도됩니다.

몇 가지 샘플 코드로 특정 질문이있는 경우 특정 답변을 얻을 수 있습니다.

+1

그들은 반환 된 배열의 항목을 여전히 대체 할 수 있습니다. 배열은 참조 유형이기도하므로이 점에서 실제로 안전하지는 않습니다. 목록의 * copy *를 만들면 원래 내부 목록이 변경되지 않도록 보호 할 수 있지만 해당 복사본은 배열로도 사용할 수 있습니다. 따라서 내부 목록의 * copy *를 반환할지 여부는 * array * 또는 * list *를 반환하는 것과 독립적입니다. –

+0

@ O.R.Mapper 당신과 동의하십시오. 당신이 반환 한'Array' 나'List'는 중요하지 않습니다. 중요한 것은 그것이 복사인지 원본인지입니다. 그러나 ToArray는 데이터 사본을 반환하는 가장 일반적인 방법입니다. –

+0

일부 상황에서는 [ReadOnlyCollection '] (http://msdn.microsoft.com/en-us/library/ms132474%28v=vs.110%29.aspx)은 통제되지 않은 변경으로부터 보호하기위한 아주 깨끗한 방법입니다 내부 목록의 우리는 적절하지 않은 것에 대한 진술을하기 위해 영업 비밀에 의한 코드를 볼 필요가 있습니다. –

0

하나의 이유는 클래스가 예를 들어 캐시로 작동한다는 것입니다. 호출자가 추가하거나 메모리를 저장 한 후 요소를 제거하지 않을 경우 하나 개의 클래스가 필드 listOfAllClients가 있고 내가 볼

List<Clients> _listOfClientCache ; 

private client[] GetSClientsByCity(string city) 
{ 
    _listOfClient.Where(x => x.Client.City = city).ToArray(); 
} 

이유 중 하나는 다음과 같이 하위 집합을 반환 할 메모리 풋 프린트이다.

리스트는 배열을 사용하여 구현되지만 밑줄 배열의 크기보다 많은 요소를 추가해야하는 경우 기본 배열 및 복사 요소의 크기가 두 배로 늘어납니다. 따라서 기본 배열 크기가 목록 내의 실제 요소보다 많을 가능성이 있습니다.

배열로 변환하면 사용되지 않는 요소에 할당 된 메모리가 비워집니다. 이 발신자가 순수 배열, 원본되지 않은 참조가 분명하다, 용량 (64), 요소가 진정한 35 IsFixedSize 카운트 출력에서 ​​요소 (35)

: 아래

[TestMethod] 
    public void ListAndArrayTest() 
    { 
     int[] array = GetArray(); 
     Debug.WriteLine("IsFixedSize {0}, Elements {1}", array.IsFixedSize, array.Length); 
// This will print IsFixedSize True, Elements 35 
    } 

    private int[] GetArray() 
    { 
     List<int> localList = new List<int>(); 
     for (int i = 0; i < 35; i++) 
     { 
      localList.Add(i); 
     } 
     Debug.WriteLine("Capacity {0}, Element Count {1}", localList.Capacity, localList.Count); 
     // This will print Capacity **64**, Element Count **35** 
     return localList.ToArray(); 
    } 

출력 테스트를하다 리스트에서 64 요소의 용량을 갖는 배열을 32 요소 이후에 사용했을 때 더 많은 요소가 필요할 때 배열의 크기를 64로 두 배로 늘리고 요소를 복사했습니다.

일단 배열로 다시 변환되면 호출자는 35 개의 요소 배열을 갖습니다.

+0

나는이 목적을 위해 새로운 배열을 반환하는 사람을 보지 못했다. 또한 메모리를 절약하지 못합니다. 당신은 여전히 ​​메모리에 원래의 목록을 가지고 있습니다, 그렇다면 그것은 어떻게 메모리를 절약합니까? –

+0

@SriramSakthivel : 원래 목록이 아직 메모리에 있다는 것을 어떻게 알 수 있습니까? 이 메소드는 항목 목록을 컴파일하고 (따라서 내부적으로'List '을 사용합니다.) 더 이상 바뀌지 않을 것이므로 결과를 배열로 반환 할 수 있습니다. –

+1

@ O.R.Mapper 그것은 논쟁의 여지가 있습니다. 우리는 OP가 어떤 문맥인지에 대해, List 이 여전히 존재하는지 여부를 알지 못합니다. 나는 이전의 것을 생각했다. 거기에 공정한 지적이있다. 주어진 구체적인 예가 있으면 우리는 구체적인 답을 제공 할 수 있습니다. –

-1

어레이리스트보다 가벼운 구조이고 조작
위한 실제적인 방법을 제공하지 :

배열에 항목을 추가하려면하거나으로부터 아이템을 삭제 (I 의미 조작에 의해 추가 및 제거 항목) 배열을 다시 정의해야합니다.

목록을 사용하면 .Add 및 .Remove와 같은 메서드를 사용하여 컬렉션 조작 구조에 더 적합하게 만들 수 있습니다.

컬렉션에있는 항목을 찾는 것에 중점을 두는 경우 - 배열을 고수해야하지만 컬렉션을 조작해야하는 경우 목록으로 이동하십시오.

목록을 마치 배열 조작을위한 특수 인터페이스처럼 생각하십시오.

+0

쓰기 가능한 인덱서는 꽤 "조작 방법"입니다. 그렇습니까? 또한이 질문에 대답하지 않습니다. 왜 기존 목록을 반환하기 전에 배열을 배열로 변환하는 것이 유용하지 않겠는가? –

+0

컬렉션에서 항목을 추가하고 제거하는 조작을 의미합니다. –

0

본 샘플 코드는 일종의 지연 평가 (예 : 대부분의 Linq 문과 동일)를 수행 할 수 있습니다. 그런 경우 첫 번째 반복에서 쿼리를 평가하는 대신 쿼리를 즉시 실행하기 위해 결과를 배열로 변환하는 것이 좋습니다.

예 :

// persons will only be lazy evaluated, which means 
// the query will only execute when the "persons" are iterated. 
var persons = Persons.Select(x => x.Name == "John Doe"); 

// here the "ToArray" forces an immediate execution of the query 
var personsArray = Persons.Select(x => x.Name == "John Doe").ToArray();