익명 유형 선언 목록
익명 형식의 목록 개체를 선언할 수 있는 방법이 있습니까?제 말은.
List<var> someVariable = new List<var>();
someVariable.Add(
new{Name="Krishna",
Phones = new[] {"555-555-5555", "666-666-6666"}}
);
런타임에 컬렉션을 만들어야 하기 때문입니다.
다이나믹은 어떻습니까?
List<dynamic> dynamicList = new List<dynamic>();
dynamicList.Add(new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } });
그것은 약간의 해킹을 포함하지만 할 수 있습니다.
static List<T> CreateListFromSingle<T>(T value) {
var list = new List<T>();
list.Add(value);
return list;
}
var list = CreateListFromSingle(
new{Name="Krishna",
Phones = new[] {"555-555-5555", "666-666-6666"}}
);
이렇게 목록을 만들 수는 있지만, 다시 심각한 해킹을 사용해야 하고, "예를 들어 유형별" 상황을 사용해야 합니다.예:
// create the first list by using a specific "template" type.
var list = new [] { new { Name="", Phones=new[] { "" } } }.ToList();
// clear the list. The first element was just an example.
list.Clear();
// start adding "actual" values.
list.Add(new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } });
일반적으로 다른 사람들이 언급한 예제 트릭에 의한 캐스팅(주장할 수 있는 나쁜 냄새)을 사용하여 유형 인수에 대한 익명 유형으로 매개 변수화된 제네릭 유형의 인스턴스를 만들 수 있습니다.단,List<T>
약간 덜 징그러운 방법이 있습니다.
var array = new[] {
new {
Name="Krishna",
Phones = new[] {"555-555-5555", "666-666-6666"}
}
};
var list = array.ToList();
제안된 구문의 스케치는 C# 3 또는 4에 대해 구현하지 않은 기능과 유사하지만 고려했습니다.우리는 이 기능을 "머블 타입"이라고 부르는데, 이는 다음과 같습니다.
List<?> myList = new List<?>() {
new {
Name="Krishna",
Phones = new[] {"555-555-5555", "666-666-6666"}
}
};
우리는 그것을 "mumble types"라고 부릅니다. 물론 당신이 그것을 읽을 것이기 때문입니다. "myList는 hrmmf의 새로운 목록입니다." :-)
이 아이디어는 컴파일러가 이니셜라이저를 보고 "var"가 "initializer를 보고 변수의 유형이 무엇인지 파악"하는 것과 같은 방식으로 가능한 유형을 파악하기 위해 최선을 다한다는 것입니다."var"를 "mumble"로 사용할 것인지 "?"(관련 기능에서 Java가 수행하는 기능과 유사함)로 사용할 것인지 아니면 다른 것인지는 미해결 문제입니다.
어쨌든, 제가 당신이라면 이 기능을 기다리면서 숨을 쉬지 않을 것입니다.지금까지 여러 언어 버전에 대한 컷오프는 되지 않았지만, 제 생각에 그것은 당분간 가능성 목록에 머물 것 같습니다.가정해보면, 우리가 언어의 미래 버전을 디자인해야 한다면,우리가 그럴 수도 있고 아닐 수도 있습니다.기억하세요, Eric의 C#의 미래 버전에 대한 생각은 오직 오락을 위한 것입니다.
다음은 다른 많은 제안보다 다소 깨끗한 접근 방식입니다.
var list = Enumerable.Repeat(new { Name = "", Phones = new[] { "" } }, 0)
.ToList();
// ...
list.Add(new { Name = "Krishna",
Phones = new[] { "555-555-5555", "666-666-6666" } });
이와 같은 익명 형식의 컬렉션은 만들 수 없습니다.
이 작업을 수행하려면 다음 중 하나를 사용해야 합니다.List<object>
또는 유형에 맞는 사용자 지정 클래스 또는 구조체를 만듭니다.
편집:
대체할 내용:
기술적으로는 익명의 유형의 목록을 만들 수 있지만 절대 그러지 않는 것이 좋습니다.이것을 하는 것은 거의 유지할 수 없는 코드를 만드는 것이기 때문에, 거의 항상 더 나은 접근법이 있습니다.익명 형식을 사용하는 대신 사용자 정의 형식을 사용하여 값을 유지하는 것이 좋습니다.
사용자 정의 유형은 컴파일러가 익명 유형을 정의하므로 컴파일 시 동일한 기능을 모두 가지고 있지만, 사용자를 따르는 개발자가 훨씬 더 쉽게 이해할 수 있습니다.
또한 여기에 "실제로는 절대 사용하고 싶지 않은 코드"를 입력했습니다.
var customer = new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } };
var someVariable = new[]{1}.Select(i => customer).ToList();
저는 익명의 유형 목록을 사용하여 시간을 절약할 방법을 찾느라 꽤 많은 시간을 보냈습니다. 그리고 나서 현재 클래스 내에서 개인 클래스를 사용하는 것이 아마도 더 빠를 것이라는 것을 깨달았습니다.
private class Lookup {
public int Index;
public string DocType;
public string Text;
}
private void MyMethod() {
List<Lookup> all_lookups = new List<Lookup> {
new Lookup() {Index=4, DocType="SuperView", Text="SuperView XML File"},
new Lookup() {Index=2, DocType="Word", Text="Microsoft Word Document"}
};
// Use my all_lookups variable here...
}
저는 이것이 가능하다고 생각하지 않습니다.C# 4에서 dynamic 키워드를 사용하는 것은 어떨까요?
언급URL : https://stackoverflow.com/questions/2327594/declaration-of-anonymous-types-list
'programing' 카테고리의 다른 글
문자열 길이가 0이 아닐 경우 Excel 개수 (0) | 2023.06.17 |
---|---|
스프링 데이터 jpa 쿼리에서 @lock timeout을 지정하는 방법은 무엇입니까? (0) | 2023.06.17 |
선택하지 않은 쿼리에 대한 사용자 지정 함수 케이크 쿼리 작성기 (0) | 2023.06.17 |
VBA 문제집.사용자가 저장할지 묻는 메시지 없이 닫으시겠습니까? (0) | 2023.06.12 |
복잡한 조인이 있는 다른 테이블의 행 가져오기 (0) | 2023.06.12 |