[C#] 익명 클래스의 일반적인 목록

C # 3.0에서는 다음 구문을 사용하여 익명 클래스를 만들 수 있습니다.

var o = new { Id = 1, Name = "Foo" };

이 익명 클래스를 일반 목록에 추가하는 방법이 있습니까?

예:

var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };

List<var> list = new List<var>();
list.Add(o);
list.Add(o1);

또 다른 예:

List<var> list = new List<var>();

while (....)
{
    ....
    list.Add(new {Id = x, Name = y});
    ....
}



답변

당신은 할 수 있습니다 :

var list = new[] { o, o1 }.ToList();

이 고양이를 스키닝하는 데는 여러 가지 방법이 있지만 기본적으로 모두 어딘가에 유형 유추를 사용합니다. 즉, 일반 메소드 (확장 메소드)를 호출해야합니다. 다른 예는 다음과 같습니다.

public static List<T> CreateList<T>(params T[] elements)
{
     return new List<T>(elements);
}

var list = CreateList(o, o1);

당신은 아이디어를 얻는다 🙂


답변

여기에 답이 있습니다.

string result = String.Empty;

var list = new[]
{ 
    new { Number = 10, Name = "Smith" },
    new { Number = 10, Name = "John" } 
}.ToList();

foreach (var item in list)
{
    result += String.Format("Name={0}, Number={1}\n", item.Name, item.Number);
}

MessageBox.Show(result);


답변

이를 수행하는 방법에는 여러 가지가 있지만 여기서 응답 중 일부는 가비지 요소가 포함 된 목록을 작성하므로 목록을 지워야합니다.

제네릭 형식의 빈 목록을 찾으려면 튜플 목록에서 선택을 사용하여 빈 목록을 만듭니다. 어떤 요소도 인스턴스화되지 않습니다.

빈 목록을 만드는 하나의 라이너는 다음과 같습니다.

 var emptyList = new List<Tuple<int, string>>()
          .Select(t => new { Id = t.Item1, Name = t.Item2 }).ToList();

그런 다음 일반 유형을 사용하여 추가 할 수 있습니다.

 emptyList.Add(new { Id = 1, Name = "foo" });
 emptyList.Add(new { Id = 2, Name = "bar" });

대안으로, 당신은 빈리스트를 만들기 위해 아래와 같은 것을 할 수 있습니다 (그러나, 나는 채워진 Tuples 컬렉션에도 사용할 수 있기 때문에 첫 번째 예를 선호합니다).

 var emptyList = new List<object>()
          .Select(t => new { Id = default(int), Name = default(string) }).ToList();   


답변

정확히는 아니지만 말할 수 List<object>있고 작동합니다. 그러나 list[0].Id작동하지 않습니다.

이것은 C # 4.0 에서 런타임 에 작동 하여List<dynamic> IntelliSense를 얻지 못합니다.


답변

나는 추측한다

List<T> CreateEmptyGenericList<T>(T example) {
    return new List<T>();
}

void something() {
    var o = new { Id = 1, Name = "foo" };
    var emptyListOfAnonymousType = CreateEmptyGenericList(o);
}

작동합니다.

다음과 같이 작성하는 것도 고려할 수 있습니다.

void something() {
    var String = string.Emtpy;
    var Integer = int.MinValue;
    var emptyListOfAnonymousType = CreateEmptyGenericList(new { Id = Integer, Name = String });
}


답변

나는 보통 다음을 사용합니다. 주로 빈 목록으로 시작합니다.

var list = Enumerable.Range(0, 0).Select(e => new { ID = 1, Name = ""}).ToList();
list.Add(new {ID = 753159, Name = "Lamont Cranston"} );
//etc.

최근에 나는 다음과 같이 작성했습니다.

var list = Enumerable.Repeat(new { ID = 1, Name = "" }, 0).ToList();
list.Add(new {ID = 753159, Name = "Lamont Cranston"} );

반복 방법을 사용하면 다음을 수행 할 수 있습니다.

var myObj = new { ID = 1, Name = "John" };
var list = Enumerable.Repeat(myObj, 1).ToList();
list.Add(new { ID = 2, Name = "Liana" });

.. 첫 번째 항목이 이미 추가 된 초기 목록을 제공합니다.


답변

코드에서이 작업을 수행 할 수 있습니다.

var list = new[] { new { Id = 1, Name = "Foo" } }.ToList();
list.Add(new { Id = 2, Name = "Bar" });