나는 목록을 가지고있다.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 '형식으로 변환 할 수 없습니다.
AllIDs
의 목록입니다IAddress
하지만 당신은string
. 컴파일러가 변환 할 수 없다고 불평하고 있습니다.List<string>
~에List<IAddress>
. 대신 다음과 같은 의미였습니까?
var substrings = AllIDs.Where(...).Select(...).ToList();
그들을 다시 넣고 싶다면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
당신의 친구입니다.
어쩌면?
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();