문자열 목록을 반환하는 함수가 있습니다.일반 목록을 배열로 변환하는 이유/이점이 있습니까?
배열처럼 루프를 반복 할 수 있습니다.
이렇게하기 전에 배열로 변환해야하는 이유가 있습니까?
편집 : List (또는 다른 유형)을 사용하여 문자열 컬렉션을 조작/작성하지만 반환 할 때 ToArray를 호출하는 이유는 필자가 온라인에서 (그리고 SO에서) 코드를 보았 기 때문입니다.
문자열 목록을 반환하는 함수가 있습니다.일반 목록을 배열로 변환하는 이유/이점이 있습니까?
배열처럼 루프를 반복 할 수 있습니다.
이렇게하기 전에 배열로 변환해야하는 이유가 있습니까?
편집 : List (또는 다른 유형)을 사용하여 문자열 컬렉션을 조작/작성하지만 반환 할 때 ToArray를 호출하는 이유는 필자가 온라인에서 (그리고 SO에서) 코드를 보았 기 때문입니다.
특정 용도로 사용해야하는 경우가 아니면 예외가 아닙니다. .NET에서 Out-of-the-Box를 사용하는 것보다 List를 조작/검색하는 데 더 많은 옵션이 있습니다.
메모리에 민감한 응용 프로그램을 작업하는 경우 배열의 메모리 공간이 조금 작아지는 것은 사실이지만 메모리가 응용 프로그램에 매우 중요한 문제가 아니라면 걱정하지 않아도됩니다.
이유 중 하나는 원래 목록을 클라이언트 코드에 노출시키지 않는 것입니다. 공개 된 경우 List<T>
이 참조 유형이므로 소스 목록을 수정할 반환 된 List<T>
에 요소를 추가/제거 할 수 있습니다. 이는 의도 한 동작이 아닐 수 있습니다.
ToArray
을 사용하고 대신 배열을 반환하면 배열의 수정에 대해 신경 쓸 필요가 없습니다. 단지 데이터 복사본이기 때문에 걱정하지 않아도됩니다.
몇 가지 샘플 코드로 특정 질문이있는 경우 특정 답변을 얻을 수 있습니다.
그들은 반환 된 배열의 항목을 여전히 대체 할 수 있습니다. 배열은 참조 유형이기도하므로이 점에서 실제로 안전하지는 않습니다. 목록의 * copy *를 만들면 원래 내부 목록이 변경되지 않도록 보호 할 수 있지만 해당 복사본은 배열로도 사용할 수 있습니다. 따라서 내부 목록의 * copy *를 반환할지 여부는 * array * 또는 * list *를 반환하는 것과 독립적입니다. –
@ O.R.Mapper 당신과 동의하십시오. 당신이 반환 한'Array' 나'List'는 중요하지 않습니다. 중요한 것은 그것이 복사인지 원본인지입니다. 그러나 ToArray는 데이터 사본을 반환하는 가장 일반적인 방법입니다. –
일부 상황에서는 [ReadOnlyCollection
하나의 이유는 클래스가 예를 들어 캐시로 작동한다는 것입니다. 호출자가 추가하거나 메모리를 저장 한 후 요소를 제거하지 않을 경우 하나 개의 클래스가 필드 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 개의 요소 배열을 갖습니다.
나는이 목적을 위해 새로운 배열을 반환하는 사람을 보지 못했다. 또한 메모리를 절약하지 못합니다. 당신은 여전히 메모리에 원래의 목록을 가지고 있습니다, 그렇다면 그것은 어떻게 메모리를 절약합니까? –
@SriramSakthivel : 원래 목록이 아직 메모리에 있다는 것을 어떻게 알 수 있습니까? 이 메소드는 항목 목록을 컴파일하고 (따라서 내부적으로'List
@ O.R.Mapper 그것은 논쟁의 여지가 있습니다. 우리는 OP가 어떤 문맥인지에 대해, List
어레이리스트보다 가벼운 구조이고 조작
위한 실제적인 방법을 제공하지 :
배열에 항목을 추가하려면하거나으로부터 아이템을 삭제 (I 의미 조작에 의해 추가 및 제거 항목) 배열을 다시 정의해야합니다.
목록을 사용하면 .Add 및 .Remove와 같은 메서드를 사용하여 컬렉션 조작 구조에 더 적합하게 만들 수 있습니다.
컬렉션에있는 항목을 찾는 것에 중점을 두는 경우 - 배열을 고수해야하지만 컬렉션을 조작해야하는 경우 목록으로 이동하십시오.
목록을 마치 배열 조작을위한 특수 인터페이스처럼 생각하십시오.
쓰기 가능한 인덱서는 꽤 "조작 방법"입니다. 그렇습니까? 또한이 질문에 대답하지 않습니다. 왜 기존 목록을 반환하기 전에 배열을 배열로 변환하는 것이 유용하지 않겠는가? –
컬렉션에서 항목을 추가하고 제거하는 조작을 의미합니다. –
본 샘플 코드는 일종의 지연 평가 (예 : 대부분의 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();
아니, 그냥 목록을 반복. –
목록이나 배열을 사용해야 할 때 궁금하지 않습니다. (함수를 추가해야 함) 목록을 사용하고 있는데 왜 배열로 변환해야합니까? – user3542112
배열을 예상하는 메서드에 목록을 전달하는 경우 배열로 변환해야합니다. –