C #에서 하위 목록을 가져 오는 방법


89

나는이 List<String>와 나는이 목록에서 하위 목록을해야합니다. .NET 3.5에서 사용할 수있는 List 메서드가 있습니까?


보유하고있는 코드 샘플을 보여 주거나 명확히 해주실 수 있나요? 나는 질문을 따르지 않습니다.
David

List <String> list = new list <String> (); 난 .. 길이-1 인덱스 2에서이 목록 말의 하위 목록을 취할 필요
토마스 Manalil에게

답변:


129

List :: GetRange (firstIndex, count)를 원합니다. http://msdn.microsoft.com/en-us/library/21k0e39c.aspx 참조

// I have a List called list
List sublist = list.GetRange(5, 5); // (gets elements 5,6,7,8,9)
List anotherSublist = list.GetRange(0, 4); // gets elements 0,1,2,3)

그게 당신이 추구하는 것입니까?

원본 목록에서 하위 목록 항목을 삭제하려는 경우 다음을 수행 할 수 있습니다.

// list is our original list
// sublist is our (newly created) sublist built from GetRange()
foreach (Type t in sublist)
{
    list.Remove(t);
}

4
foreach .....로 항목을 반복하는 동안에는 목록에서 항목을 제거 할 수 없습니다!
slugster 2009

민달팽이; 목록 'a'에서 삭제하는 동안 목록 'b'를 반복하고 있습니다. 그것은 합법적입니다 :)
Josh

6

List에서 LINQ 쿼리를 실행하는 것만 큼 쉬울까요?

List<string> mylist = new List<string>{ "hello","world","foo","bar"};
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();

1
이것은 원래 목록의 일부에 대한보기가 아니라 원래 목록 세그먼트의 복사본입니다.
Asad Saeeduddin

@Asad이 답변의 요점은 OP가 LINQ를 사용할 수 있음을 설명하는 것입니다. 당신은 그것이 사본을 만든다고 지적했습니다. 환상적입니다. 당신의 재능은 내가 5.5 년 전에 남긴 것보다 더 세밀하게 설명하기 위해이 질문을 편집하는 데 더 잘 사용될 수있을 것입니다. 당신이 그것을 편집하면, 당신은 pedantry의 인터넷 사법 리그에서 크레딧을 얻을 것이고 잘 얻을 것입니다!
p.campbell

10
나는 ( 다른 사람들처럼 ) subList원래 목록에 변경 가능한 뷰를 제공하는 Java 와 유사한 것을 찾고있었습니다 . 이것은 다르게 작동하며 즉시 명확하지 않을 수 있으므로 나중에 이것을 보는 사람의 이익을 위해 지적하는 것이 도움이 될 것이라고 생각했습니다. 주제를 벗어난다면 요가 나 명상 등을하고 싶을 수 있습니다. 당신은 어떤 도발도없이 미쳐 얼굴을 붉 히지 않았습니다.
Asad Saeeduddin 2015

3

LINQ의 Where 절을 사용합니다.

List<object> x = new List<object>();
x.Add("A");
x.Add("B");
x.Add("C");
x.Add("D");
x.Add("B");

var z = x.Where(p => p == "A");
z = x.Where(p => p == "B");

위의 문에서 "p"는 목록에있는 개체입니다. 따라서 데이터 개체를 사용한 경우, 즉 :

public class Client
{
    public string Name { get; set; }
}

그러면 linq는 다음과 같습니다.

List<Client> x = new List<Client>();
x.Add(new Client() { Name = "A" });
x.Add(new Client() { Name = "B" });
x.Add(new Client() { Name = "C" });
x.Add(new Client() { Name = "D" });
x.Add(new Client() { Name = "B" });

var z = x.Where(p => p.Name == "A");
z = x.Where(p => p.Name == "B");

정교하게 만든 후 첫 번째 예제를 사용하여 다음을 추가하십시오. z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p));
slugster 2009

2

LINQ 사용 :

List<string> l = new List<string> { "1", "2", "3" ,"4","5"};
List<string> l2 = l.Skip(1).Take(2).ToList();

foreach가 필요하면 ToList가 필요하지 않습니다.

foreach (string s in l.Skip(1).Take(2)){}

LINQ의 장점은 선행 요소를 건너 뛰려면 다음을 수행 할 수 있다는 것입니다.

List<string> l2 = l.Skip(1).ToList();
foreach (string s in l.Skip(1)){}

즉, 개수 / 길이 등을 처리 할 필요가 없습니다.


0

컬렉션 클래스에는 필터를 정의하기 위해 전달 된 기준에 따라 컬렉션 (하위 목록)을 반환하는 메서드가있을 수 있습니다. foreach 루프를 사용하여 새 컬렉션을 만들고 전달합니다.

또는 "filtered"또는 "active"플래그 (속성)를 설정하여 메서드와 루프가 기존 컬렉션을 수정하도록합니다. 이것은 작동 할 수 있지만 다중 스레드 코드에서 문제를 일으킬 수도 있습니다. 다른 개체가 컬렉션의 내용을 무시한 경우 데이터 사용 방법에 따라 좋거나 나쁘다.


0

하위 목록의 항목 반전

int[] l = {0, 1, 2, 3, 4, 5, 6};
var res = new List<int>();
res.AddRange(l.Where((n, i) => i < 2));
res.AddRange(l.Where((n, i) => i >= 2 && i <= 4).Reverse());
res.AddRange(l.Where((n, i) => i > 4));

0,1,4,3,2,5,6 제공


Range정수 데이터 유형에서는 참입니다. 데이터 유형이 DataTime있고 두 특정 날짜 사이의 레코드 목록을 검색해야하는 경우 어떻게 됩니까?
Jogi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.