2

나는 목록을 가지고있다.AllIDs:

List<IAddress> AllIDs = new List<IAddress>();

나하고 싶어substring멤버 필드에 대한 작업AddressId문자 "_"를 기반으로합니다.

LINQ 쿼리를 사용하고 있지만 컴파일 오류가 발생합니다.

AllIDs= AllIDs.Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_"))
    .Select(s => s.AddressId.Substring(s.AddressId.IndexOf("_")))
    .ToList();

오류:

암시 적으로 'System.Collections.Generic.List '형식을 'System.Collections.Generic.List '형식으로 변환 할 수 없습니다.

3 답변


3

AllIDs의 목록입니다IAddress하지만 당신은string. 컴파일러가 변환 할 수 없다고 불평하고 있습니다.List<string>~에List<IAddress>. 대신 다음과 같은 의미였습니까?

var substrings = AllIDs.Where(...).Select(...).ToList();


  • 하지만 문제는 결과 목록을 드롭 다운의 데이터 소스로 제공하려고합니다. 결과 List에는 속성 AddressID가 없습니다. - user1740172

0

그들을 다시 넣고 싶다면Address개체 (Address수업 외에도IAddress인터페이스), 당신은 이것과 같은 것을 할 수 있습니다 (생성자가Address그 자리에있다) :

AllIDs = AllIDs.Where(...).Select(new Address(s.AddressID.Substring(s.AddressID.IndexOf("_")))).ToList();

메서드 구문 대신 LINQ에 대한 쿼리 구문을 사용하여 살펴 봐야합니다. 이렇게하면 많은 쿼리를 쉽게 정리하고 읽을 수 있습니다. 원본 (수정되지 않은) 검색어는 다음과 대략 같습니다.

var substrings = from a in AllIDs
                 let id = a.AddressId
                 let idx = id.IndexOf("_")
                 where id.Length >= idx
                 select id.Substring(idx);

이것은 실제로 스타일 일 뿐이며 원본과 동일한 것으로 컴파일됩니다. 약간의 차이점은 전화를 걸기 만하면된다는 것입니다.String.IndexOf()항목 당 두 번, 항목 당 두 번이 아닙니다.let당신의 친구입니다.


  • 안녕 매튜는 응답에 감사드립니다. 그러나 문제는 드롭 다운에 대한 데이터 소스로 예제 하위 문자열에 결과 목록을 제공하려고합니다. 그리고 결과 List는 아래에 사용 된 AddressID 속성을 가지지 않을 것입니다. ddl.DataSource = AllIDs; ddl.DataTextField = "AddressID"; ddl.DataValueField = "AddressID"; ddl.DataBind (); ForEach를 사용할 수는 있지만 LINQ를 사용하여이를 수행하려고합니다. 모든 포인터 ?? - user1740172
  • wasp의 해결책을 보면,이 데이터 바인딩과 함께 작동해야합니다. - Matthew Kennedy

0

어쩌면?

var boundable  = 
    from s id in AllIDs
    where s.AddressId.Length >= s.AddressId.IndexOf("_")
    select new { AddressId = s.AddressId.Substring(s.AddressId.IndexOf("_")) };
boundable = boundable.ToList();

관련된 질문

최근 질문