2010-03-16 4 views
5
public static ArrayList GetStudentAsArrayList() 
{ 
    ArrayList students = new ArrayList 
    { 
     new Student() { RollNumber = 1,Name ="Alex " , Section = 1 ,HostelNumber=1 }, 
     new Student() { RollNumber = 2,Name ="Jonty " , Section = 2 ,HostelNumber=2 } 
    }; 
    return students; 
} 

다음 코드는 컴파일되지 않습니다.LINQ :이 쿼리가 ArrayList에서 작동하지 않는 이유는 무엇입니까?

ArrayList lstStudents = GetStudentAsArrayList(); 
var res = from Student r in lstStudents select r; 

는 사람이 차이가 두 조각 사이에 무엇인지 설명 할 수 : 오류이 컴파일 ArrayList is not IEnumerable

ArrayList lstStudents = GetStudentAsArrayList(); 
var res = from r in lstStudents select r; 

입니까? 왜 두 번째 작품?

답변

9

ArrayList는 서로 다른 유형의 객체를 수집 할 수 있으므로 컴파일러는 어떤 유형의 객체를 사용해야하는지 알지 못합니다.

두 번째 쿼리는 ArrayList의 각 개체를 명시 적으로 Student라고 입력합니다.

ArrayList 대신 List<>을 사용하는 것이 좋습니다.

2

배열 목록은 형식이 지정되지 않으므로 원하는 유형을 정의해야합니다. 제네릭으로 강력하게 형식화 된 List 클래스를 사용하십시오.

List<Student> lstStudents = GetStudentAsArrayList(); 
var res = from r in lstStudents select r; 
6

두 번째 경우에는 컬렉션의 유형을 LINQ에 알리는 것입니다. 나는 당신의 조각 얻을 오류가 있음을

IEnumerable<Student> _set = lstStudents.Cast<Student>(); 
1

참고 :

은을 찾을 수 없습니다 당신이 캐스트 <T>을 사용할 수 있습니다 LINQ에 효과적으로 사용하기 위해, 그래서 ArrayList를 약하게, 입력 된 구현 소스 형식에 대한 쿼리 패턴 'System.Collections.ArrayList'. '선택'을 찾을 수 없습니다. 범위 변수 'r'의 유형을 명시 적으로 지정한다고 생각하십시오.

그래서 대체 솔루션 (거의 확실하게 더 좋은 생각은 아닙니다)은 ArrayList에 Select Extension 메서드를 정의하는 것입니다.

다른 오류는 다른 네임 스페이스가 포함 된 것 같습니다. 이 직접 질문에 대한 대답으로 나는 추가해야

+0

뭔가, 두 번째 (작업) 버전은 내부적으로 lstStudents.Cast ()를 선택 R에서 R에서 같은 VAR 입술 =을 구현; 이 질문에 대답하지 않기 때문에 –

-1

ArrayList.Cast().Select()

+3

-1입니다. –

관련 문제