問題は、匿名型を使用しているためです (ただし、最初にそれらを使用しようとしているので、これで問題ない可能性があります)。このリストを実際に宣言したり渡したりすることはできません (どのように宣言しList<SomeAnonymousTypeThatDoesNotHaveAName>
ますか?)
ただし、ジェネリック型推論を利用して、ジェネリックとチートを使用できますvar
。
public List<T> BuildList<T>(params T[] entries)
{
return new List<T>(entries);
}
を呼び出す場合もBuildList
、これらは匿名型であるため、明示的に を割り当てることはできません<T>
が、型の推論に処理させることはできます!
var list = BuildList(
new { Name = 1, Age = 31 },
new { Name = 2, Age = 31 },
new { Name = 3, Age = 4 },
new { Name = 4, Age = 1 },
new { Name = 5, Age = 1 });
型推論は匿名型を適切に処理し、リストを作成します!
Console.WriteLine(list.Count); //5
Console.WriteLine(list[0].Name + ", " + list[0].Age); //1, 31
Console.WriteLine(list.GetType().FullName); //System.Collections.Generic.List`1[[<>f__AnonymousType0`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], query_jyattd, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]
編集: 拡張メソッドを作成するのがさらに良いです!
public static class ArrayExtensions
{
public static List<T> MakeAnonymousList<T>(this T[] entries)
{
return new List<T>(entries);
}
}
次に、次のように使用できます。
var list = new[] {
new { Name = 1, Age = 31 },
new { Name = 2, Age = 31 },
new { Name = 3, Age = 4 },
new { Name = 4, Age = 1 },
new { Name = 5, Age = 1 }}
.MakeAnonymousList();
編集: クールなことは、List<T>
Linq を追加/削除/削除できる完全に機能することです。項目の追加は、同じパラメーターと順序で行う必要があります。
list.Add(new { Name = 6, Age = 2 }); //OK
list.Add(new { Age = 2, Name = 6 }); //compile error!
var maxAge = list.Max(person => person.Age);
var oldPerson = list.Where(person => person.Age == maxAge).First();
Console.WriteLine(maxAge); //31
Console.WriteLine(oldPerson.Name + ", " + oldPerson.Age); //1, 31
インテリセンスも大活躍!