문제

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" });

대안으로, 빈 목록을 만들기 위해 아래와 같은 것을 수행 할 수 있습니다 (그러나 첫 번째 예제를 선호합니다. 첫 번째 예제를 선호합니다.

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

정확히는 아니지만 말할 수 있습니다 List<object> 그리고 일이 효과가있을 것입니다. 하지만, list[0].Id 작동하지 않습니다.

이것은 작동합니다 런타임에 C# 4.0에서 a List<dynamic>, 그것은 당신이 지능을 얻지 못할 것입니다.

나는 추측한다

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" });

나는 몇 가지 답변으로 IL을 확인했다. 이 코드는 효율적으로 빈 목록을 제공합니다.

    using System.Linq;
    …
    var list = new[]{new{Id = default(int), Name = default(string)}}.Skip(1).ToList();

최신 버전 4.0에서는 아래와 같이 동적을 사용할 수 있습니다.

var list = new List<dynamic>();
        list.Add(new {
            Name = "Damith"
    });
        foreach(var item in list){
            Console.WriteLine(item.Name);
        }
    }

여기 내 시도가 있습니다.

List<object> list = new List<object> { new { Id = 10, Name = "Testing1" }, new {Id =2, Name ="Testing2" }}; 

나는 사용자 정의 유형에 대한 익명 목록을 만들기 위해 비슷한 것을 썼을 때 이것을 생각해 냈습니다.

다음은 빈 목록으로 시작할 수 있지만 여전히 Intellisense에 액세스 할 수있는 익명 유형 목록을 작성하는 또 다른 방법입니다.

var items = "".Select( t => new {Id = 1, Name = "foo"} ).ToList();

첫 번째 항목을 유지하려면 문자열에 한 글자를 넣으십시오.

var items = "1".Select( t => new {Id = 1, Name = "foo"} ).ToList();

대신 :

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);

당신은 이것을 할 수 있습니다 :

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

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

그러나 런타임에 작동하지만 다른 범위에서 이와 같은 작업을 시도하면 컴파일 타임 오류가 발생합니다.

private List<object> GetList()
{ 
    List<object> list = new List<object>();
    var o = new { Id = 1, Name = "Foo" }; 
    var o1 = new { Id = 2, Name = "Bar" }; 
    list.Add(o); 
    list.Add(o1);
    return list;
}

private void WriteList()
{
    foreach (var item in GetList()) 
    { 
        Console.WriteLine("Name={0}{1}", item.Name, Environment.NewLine); 
    }
}

문제는 Intellisense가 속성을 표시하지만 런타임에 객체 구성원 만 사용할 수 있다는 것입니다. ID 그리고 이름.

.NET 4.0에서 솔루션은 키워드를 사용하는 것입니다. 동적 istead 물체 위의 코드에서.

또 다른 해결책은 반사를 사용하여 속성을 얻는 것입니다.

using System;
using System.Collections.Generic;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            var anonymous = p.GetList(new[]{
                new { Id = 1, Name = "Foo" },       
                new { Id = 2, Name = "Bar" }
            });

            p.WriteList(anonymous);
        }

        private List<T> GetList<T>(params T[] elements)
        {
            var a = TypeGenerator(elements);
            return a;
        }

        public static List<T> TypeGenerator<T>(T[] at)
        {
            return new List<T>(at);
        }

        private void WriteList<T>(List<T> elements)
        {
            PropertyInfo[] pi = typeof(T).GetProperties();
            foreach (var el in elements)
            {
                foreach (var p in pi)
                {
                    Console.WriteLine("{0}", p.GetValue(el, null));
                }
            }
            Console.ReadLine();
        }
    }
}
var list = new[]{
new{
FirstField = default(string),
SecondField = default(int),
ThirdField = default(double)
}
}.ToList();
list.RemoveAt(0);

동적 목록을 만들 수 있습니다.

List<dynamic> anons=new List<dynamic>();
foreach (Model model in models)
{
   var anon= new
   {
      Id = model.Id,
      Name=model.Name
   };
   anons.Add(anon);
}

"Dynamic"은 첫 번째 값으로 초기화됩니다.

이런 식으로 할 수 있습니다.

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

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

list.Add(new { Id = 3, Name = "Yeah" });

그것은 나에게 약간의 "해킹"인 것처럼 보이지만, 실제로 목록이 필요하고 익명 배열 만 사용할 수 없다면 작동합니다.

이것은 오래된 질문이지만 나는 내 C#6 대답이다.저는 종종을 설정할 수 있는 테스트 데이터를 쉽게에서 입력한 코드 목록으로의 튜플이 있습니다.의 부부와 함께 확장 기능이 있는 것이 가능하이,콤팩트 형식으로 반복하지 않고 이름을 각 항목입니다.

var people= new List<Tuple<int, int, string>>() {
    {1, 11, "Adam"},
    {2, 22, "Bill"},
    {3, 33, "Carol"}
}.Select(t => new { Id = t.Item1, Age = t.Item2, Name = t.Item3 });

이 제공하는 폐쇄-만약 당신이 원하는 목록에 추가할 수 있는 다음 추가 ToList().

마법에서 온 사용자 지정 확장 프로그램 추가하는 방법에 대한 튜플로에서 설명 https://stackoverflow.com/a/27455822/4536527.

public static class TupleListExtensions    {
    public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
            T1 item1, T2 item2)       {
        list.Add(Tuple.Create(item1, item2));
    }

    public static void Add<T1, T2, T3>(this IList<Tuple<T1, T2, T3>> list,
            T1 item1, T2 item2, T3 item3) {
        list.Add(Tuple.Create(item1, item2, item3));
    }

// and so on...

}

유일한 것은 내가 좋아하지 않은 형태에서 분리 이름,하지만 당신은 정말 하고 싶지 않 새로운 클래스를 다음 이 접근 방식이 여전히 당신이 당신을 읽을 수 있는 데이터입니다.

두 번째 예제는 새로운 것을 초기화 해야하는 경우 List<T>, 한 가지 아이디어는 익명 목록을 작성한 다음 지우는 것입니다.

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

//and you can keep adding.
while (....)
{
    ....
    list.Add(new { Id = x, Name = y });
    ....
}

또는 확장 방법으로 더 쉬워야합니다.

public static List<T> GetEmptyListOfThisType<T>(this T item)
{
    return new List<T>();
}

//so you can call:
var list = new { Id = 0, Name = "" }.GetEmptyListOfThisType();

또는 아마도 더 짧아서

var list = new int[0].Select(x => new { Id = 0, Name = "" }).Tolist();

파생 이 답변, 나는 작업을 수행 할 수있는 두 가지 방법을 생각해 냈습니다.

    /// <summary>
    /// Create a list of the given anonymous class. <paramref name="definition"/> isn't called, it is only used
    /// for the needed type inference. This overload is for when you don't have an instance of the anon class
    /// and don't want to make one to make the list.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="definition"></param>
    /// <returns></returns>
#pragma warning disable RECS0154 // Parameter is never used
    public static List<T> CreateListOfAnonType<T>(Func<T> definition)
#pragma warning restore RECS0154 // Parameter is never used
    {
        return new List<T>();
    }
    /// <summary>
    /// Create a list of the given anonymous class. <paramref name="definition"/> isn't added to the list, it is
    /// only used for the needed type inference. This overload is for when you do have an instance of the anon
    /// class and don't want the compiler to waste time making a temp class to define the type.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="definition"></param>
    /// <returns></returns>
#pragma warning disable RECS0154 // Parameter is never used
    public static List<T> CreateListOfAnonType<T>(T definition)
#pragma warning restore RECS0154 // Parameter is never used
    {
        return new List<T>();
    }

당신은 같은 방법을 사용할 수 있습니다

var emptyList = CreateListOfAnonType(()=>new { Id = default(int), Name = default(string) });
//or
var existingAnonInstance = new { Id = 59, Name = "Joe" };
var otherEmptyList = CreateListOfAnonType(existingAnonInstance);

이 답변 비슷한 생각이 있지만, 그 방법을 만들 때까지는 보지 못했습니다.

이것으로 시도하십시오 :

var result = new List<object>();

foreach (var test in model.ToList()) {
   result.Add(new {Id = test.IdSoc,Nom = test.Nom});
}
static void Main()
{
    List<int> list = new List<int>();
    list.Add(2);
    list.Add(3);
    list.Add(5);
    list.Add(7);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top