2009-10-14 2 views
50

저는 C#을 사용하고 .NET Framework 3.5를 대상으로합니다. 나는 ListBox에있는 모든 항목을 List<String> (일반 List)에 복사하는 작고 간결하며 효율적인 코드를 찾고 있습니다. 순간 ListBox.items를 일반 목록으로 변환하는 가장 간결한 방법

나는 아래의 코드와 유사 뭔가를 :

물론, 작동하지만 내가 함께이 일을 더 나은 방법이 있어야한다는 도움이되지만 느낌을 얻을 수
 List<String> myOtherList = new List<String>(); 
     // Populate our colCriteria with the selected columns. 

     foreach (String strCol in lbMyListBox.Items) 
     { 
      myOtherList.Add(strCol); 
     } 

일부 새로운 언어 기능. List.ConvertAll 메서드와 같은 것을 생각하고 있었지만 이것은 일반 목록에만 적용되고 ListBox.ObjectCollection 컬렉션에는 적용되지 않습니다.

+0

목록 상자에있는 개체는 무엇입니까? – stevehipwell

+0

죄송합니다 - 명시 적으로 문자열임을 명시해야합니다. – jamiei

+0

확장 메서드는 내가 좋아하는 것입니다 – nawfal

답변

87

는 LINQ의 비트를 수행해야합니다 -

물론
var myOtherList = lbMyListBox.Items.Cast<String>().ToList(); 

당신은 당신이에 저장 한 어떤 유형으로 캐스트의 유형 매개 변수를 수정할 수 있습니다 Items 속성.

+0

좋은 답변, 고마워. – jamiei

+0

'List Mylist = new List (lbMyListBox.Items.Cast ());'더 좋거나 아무런 차이가 없습니까? 이 질문을 던지면 다른 목록을 만들지 않겠습니까? – ThunderGr

5

이것에 대해 어떻게 :

List<string> myOtherList = (from l in lbMyListBox.Items.Cast<ListItem>() select l.Value).ToList(); 
2

무엇에 대해 :

myOtherList.AddRange(lbMyListBox.Items); 
의견에 따라

편집 및 DavidGouge의 대답 :

myOtherList.AddRange(lbMyListBox.Items.Select(item => ((ListItem)item).Value)); 
+0

다음 오류가 발생합니다. 'System.Windows.Forms.ListBox.ObjectCollection'에서 'System.Collections.Generic.IEnumerable ' –

+0

으로 변환 할 수 없습니다. ObjectCollection은 IEnumerable이지만 AddRange에 필요한 IEnumerable 이 아닙니다. – AnthonyWJones

+0

이것은 나를 위해 심지어 컴파일하지 않는다 – nawfal

26

다음은 LINQ (사용)을 수행합니다

List<string> list = lbMyListBox.Items.OfType<string>().ToList(); 

OfType 전화를 것이다 문자열 인 목록 상자 항목의 항목 만 사용되는지 확인하십시오.

Cast을 사용하면 항목 중 하나라도 문자열이 아니면 예외가 발생합니다.

+2

그것은 좋은 것을 알고있다! : D – DavidGouge

+1

물론 OfType을 사용하면 결과 목록에 항목이 누락되었을 수 있습니다. 항목 세트가 특정 유형으로 예상되는 경우, 잘못된 유형이 ListBox에 추가 된 버그 (쉽게 수행 할 수 있음)를 숨기지 않으므로 Cast를 사용하십시오.Additionaly OfType은 Conversion 연산자가 예상되는 출력 유형을 갖는 항목을 건너 뛰고 Cast는 변환기 연산자를 호출합니다. – AnthonyWJones

+1

예. 나는 "문자열에 캐스팅 할 수없는 항목"을 실제로 말해야합니다. OfType 문제는 좋은 지적이지만, ListBox에 문자열 만 포함하면 오류가있는 곳에서 오류가 발생하는 것을 막을 수 있습니다. – adrianbanks

1

더 이상 필요하지 않습니다. 목록 상자에서 모든 값 목록 가져 오기

private static List<string> GetAllElements(ListBox chkList) 
     { 
      return chkList.Items.Cast<ListItem>().Select(x => x.Value).ToList<string>(); 
     } 
관련 문제