목록 에서 목록 으로 캐스팅하기 위한 더 짧은 구문?
한 유형에서 다른 유형으로 항목 목록을 한 번에 하나씩 캐스팅할 수 있습니다(객체에 캐스팅을 위한 공용 정적 명시 연산자 메서드가 있는 경우).
List<Y> ListOfY = new List<Y>();
foreach(X x in ListOfX)
ListOfY.Add((Y)x);
하지만 한 번에 전체 목록을 섭외하는 것은 불가능한가요?예를들면,
ListOfY = (List<Y>)ListOfX;
ifX 말말 to to to에 될 수 Y 수 예요.
List<Y> listOfY = listOfX.Cast<Y>().ToList();
몇 가지 주의사항 (댓글 작성자님들께!)
- 때 반드시 포함시켜야 돼요.
using System.Linq; - 이렇게 하면 목록 자체가 아니라 목록의 각 항목이 캐스팅됩니다. ★★★★★
List<Y>는, 됩니다.ToList(). - 이 메서드는 사용자 지정 변환 연산자를 지원하지 않습니다.( "Linq Cast <> 도우미가 암묵적 캐스트 연산자와 함께 작동하지 않는 이유는 무엇입니까?"를 참조해 주십시오.)
- 이 메서드는 명시적 연산자 메서드(프레임워크 4.0)를 가진 개체에는 작동하지 않습니다.
출연자var ListOfY = (List<Y>)ListOfX이 경우 의 공동/반대성이 필요하기 때문에 가능하지 않습니다.List<T>모든 경우에 확실한 것은 아닙니다.이 캐스팅 문제에 대한 해결책을 읽어보시기 바랍니다.
다음과 같이 코드를 쓸 수 있는 것은 정상인 것 같습니다.
List<Animal> animals = (List<Animal>) mammalList;
왜냐하면 우리는 모든 포유동물이 동물이 될 것이라고 보장할 수 있기 때문에 이것은 명백한 실수이다.
List<Mammal> mammals = (List<Mammal>) animalList;
왜냐하면 모든 동물이 포유동물은 아니기 때문이다.
단, C#3 이후를 사용하면
IEnumerable<Animal> animals = mammalList.Cast<Animal>();
츠키노하여 각 코드를합니다.각 코드를 캐스팅하기 위해 명시적인 캐스트를 사용합니다.Mammal의 in an to의 Animal이치노
프로세스에 가 더 한 경우 "/"/"를 할 수 .ConvertAll의 of의 List<T>- 할 수 .class - 제 class 、 제 class class class 。 베니핏을 한다.List 「」가 아닌 「」IEnumerable 'No'는 없습니다.ToList()수입니니다다
List<object> o = new List<object>();
o.Add("one");
o.Add("two");
o.Add(3);
IEnumerable<string> s1 = o.Cast<string>(); //fails on the 3rd item
List<string> s2 = o.ConvertAll(x => x.ToString()); //succeeds
Sweko의 요점에 덧붙이자면:
출연자들이
var listOfX = new List<X>();
ListOf<Y> ys = (List<Y>)listOfX; // Compile error: Cannot implicitly cast X to Y
돼요. 안 돼요.List<T>Type T에서는 불변하기 때문에, 그 유무는 문제가 되지 않습니다.XY - 은 ) - 「 」List<T>는 다음과 같습니다
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T> ... // Other interfaces
에는 (라고 하다)라고합니다.T여기에는 추가 분산 수식자가 없습니다.)
단, 설계에 가변 컬렉션이 필요하지 않은 경우, 예를 들어 다음과 같은 경우 불변 컬렉션의 많은 업캐스트가 가능합니다.GiraffeAnimal:
IEnumerable<Animal> animals = giraffes;
그 이유는IEnumerable<T>합니다.T이 되네. - .IEnumerable는 컬렉션에서 요소를 추가 또는 삭제하는 메서드가 지원되지 않기 때문에 컬렉션을 변경할 수 없음을 나타냅니다.해 주세요.out「」의 합니다.IEnumerable<T>:
public interface IEnumerable<out T> : IEnumerable
(여기에서는 변이 가능한 컬렉션이 다음과 같은 이유를 자세히 설명합니다.List할 수 없다covariance 및 은 가능합니다
★★★★★★★를 사용한 캐스팅:.Cast<T>()
다른 사람들이 언급했듯이, T에 캐스팅된 요소의 새로운 컬렉션을 투영하기 위해 컬렉션에 적용할 수 있지만, 그렇게 하면 이 컬렉션이 느려집니다.InvalidCastException를 할 수 없는 인 캐스트를 과 같은 ).foreach이네이블화면)
및 에 사용OfType<T>()
않는 다른 유형의 되어 있는 잠재적인 는 다음과 같습니다.InvalidCastException대신 사용함으로써 피할 수 있다.Cast<T>() ( . ).OfType<>()는 변환을 시도하기 전에 요소를 타깃유형으로 변환할 수 있는지 여부를 확인하고 호환되지 않는 유형을 필터링합니다).
앞지르다
또한 OP가 대신 이 내용을 기술한 경우에는 다음과 같이 주의해 주십시오.foreach)
List<Y> ListOfY = new List<Y>();
foreach(Y y in ListOfX)
{
ListOfY.Add(y);
}
이치노,수 없는 , " " ", " " " "InvalidCastException발생하게 됩니다.
예
예를 들어, 단순(C#6) 클래스 계층이 지정되어 있는 경우:
public abstract class Animal
{
public string Name { get; }
protected Animal(string name) { Name = name; }
}
public class Elephant : Animal
{
public Elephant(string name) : base(name){}
}
public class Zebra : Animal
{
public Zebra(string name) : base(name) { }
}
혼합 유형의 컬렉션으로 작업하는 경우:
var mixedAnimals = new Animal[]
{
new Zebra("Zed"),
new Elephant("Ellie")
};
foreach(Animal animal in mixedAnimals)
{
// Fails for Zed - `InvalidCastException - cannot cast from Zebra to Elephant`
castedAnimals.Add((Elephant)animal);
}
var castedAnimals = mixedAnimals.Cast<Elephant>()
// Also fails for Zed with `InvalidCastException
.ToList();
반면:
var castedAnimals = mixedAnimals.OfType<Elephant>()
.ToList();
// Ellie
코끼리만 걸러낸다. 즉, 얼룩말은 탈락한다.
참조: 암묵적 캐스트 연산자
동적 변환 연산자가 없으면 사용자 정의 변환 연산자는 컴파일 시간*에만 사용되므로 Zebra와 Elephant 간의 변환 연산자를 사용할 수 있게 되더라도 위의 변환 접근법 실행 시간 동작은 변경되지 않습니다.
Zebra를 Elephant로 변환하기 위해 변환 연산자를 추가하는 경우:
public class Zebra : Animal
{
public Zebra(string name) : base(name) { }
public static implicit operator Elephant(Zebra z)
{
return new Elephant(z.Name);
}
}
연산자를 을 ""에서 할 수 .Animal[]로로 합니다.Elephant[]얼룩말들이 이제 코끼리들의 동종 집단으로 바뀔 수 있다는 것을 고려하면:
var compilerInferredAnimals = new []
{
new Zebra("Zed"),
new Elephant("Ellie")
};
실행 시 암묵 변환 연산자 사용
*Eric이 언급한 바와 같이 변환 오퍼레이터는 실행 시 다음을 통해 액세스할 수 있습니다.dynamic:
var mixedAnimals = new Animal[] // i.e. Polymorphic collection
{
new Zebra("Zed"),
new Elephant("Ellie")
};
foreach (dynamic animal in mixedAnimals)
{
castedAnimals.Add(animal);
}
// Returns Zed, Ellie
하시면 됩니다.List<Y>.ConvertAll<T>([Converter from Y to T]);
은 이에 대한 말한 및 @SWeko가 이 될 수 .List<X>할 수 없다List<Y>List<X> 수 IEnumerable<Y>이치노
예를 들어:
List<Y> ListOfY = new List<Y>();
List<X> ListOfX = (List<X>)ListOfY; // Compile error
그렇지만
List<Y> ListOfY = new List<Y>();
IEnumerable<X> EnumerableOfX = ListOfY; // No issue
큰 장점은 메모리에 새 목록이 생성되지 않는다는 것입니다.
X'Y'를 도 있습니다.ToList<T> method를 합니다.Cast<T>
listOfX.ToList<Y>()
dynamic data = List<x> val;
List<y> val2 = ((IEnumerable)data).Cast<y>().ToList();
언급URL : https://stackoverflow.com/questions/5115275/shorter-syntax-for-casting-from-a-listx-to-a-listy
'programing' 카테고리의 다른 글
| Bash를 사용하여 존재하지 않는 서브디렉토리를 재귀적으로 작성하려면 어떻게 해야 합니다. (0) | 2023.04.09 |
|---|---|
| 빌드 시 명령 복사본이 코드 4와 함께 종료됨 - Visual Studio 재시작으로 해결 (0) | 2023.04.09 |
| Bash 스크립트에서 특정 상황이 발생했을 때 스크립트 전체를 종료하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
| UITableView - 섹션 헤더 색상 변경 (0) | 2023.04.09 |
| Excel VBA에서 변경된 셀의 이전 값을 얻으려면 어떻게 해야 합니까? (0) | 2023.04.09 |