2009-08-17 3 views

답변

10

이다, 42, 7 인쇄됩니다 : Kamarey가 지적한대로, 당신은 읽기 전용보기를 할 수 있습니다 LINQ

list.Skip(fromRange).Take(toRange - fromRange) 
+2

원본 목록 또는 범위 복사본으로 뷰를 반환합니까? –

+0

List에서뿐 아니라 IList에서 작동합니다. 이것은 내가 찾고 있던 것입니다. – ripper234

+1

@ Joachim Sauer : 이것은 쿼리이며 결과는 평가 방법에 따라 다릅니다. 평가하는 동안 일부 규칙을 적용하는 목록 요소를 반복합니다. 이것은 Java의 subList 함수에 대한 직접적인 아날로그가 아니며,이 경우에는 비교하는 것이 실수입니다. – Kamarey

9

일반 List<T>의 경우 GetRange(int, int) 메서드입니다.

편집 : 원본의 '보기'가 아닌 얕은 사본임을 유의하십시오. 나는 C#이 정확한 기능을 제공한다고 생각하지 않는다.

Edit2가 :

List<int> integers = new List<int>() { 5, 6, 7, 8, 9, 10, 11, 12 }; 
IEnumerable<int> view = integers.Skip(2).Take(3); 
integers[3] = 42; 

foreach (int i in view) 
    // output 

+2

MSDN 설명서 (http://msdn.microsoft.com/en-us/library/21k0e39c.aspx)에서 GetRange()는 얕은 복사본을 반환하고 subList()는 뷰 (즉, 뷰)를 반환합니다. subList()에 대한 변경 사항은 원래 목록에 반영됩니다!) –

+0

네가 옳다. 이것이 정확한 요구 사항인지 확실하지 않지만 그것을 반영하도록 내 대답을 수정하겠습니다. – Razzie

1

GetRange 9. 사용하여 대답

+3

다시 :보기와 달리 얕은 사본을 반환하기 때문에 똑같은 것은 아닙니다. 뷰를 반환하면 (예를 들어 list.subList (x, y) .clear()) 쉽게 작성할 수 있기 때문에 RemoveRange() 메서드를 제공 할 필요가 없습니다. –

+0

정직하게 말하면 나는 이점을 실제로 볼 수 없다고 말해야합니다. 또한 removeRange() 및 subList.clear()는 동일한 작업을하는 것처럼 들리지 않습니다. 삭제 작업은 범위를 제거하는 것과 동일하지 않아야합니다. 그러나 오 잘 :-) – Razzie

+5

subList()가 뷰를 원본 목록으로 복사하고 복사본을 반환하지 않는다면 someList.subList (1,3) .clear()가 원래 목록에서 개체를 제거하십시오. 그리고 가장 중요한 부분은 더 좋든 그렇지 않든, subList()와 GetRange()는 똑같은 일을하지 않으므로 동등한 표현으로 사용해서는 안됩니다 (적어도 면책 조항이없는 것은 아닙니다). –