我有一个类型对象列表
List<object> _list;
我在方法中初始化此列表,并添加一些具有属性
的项目void CreateList()
{
_list= new List<object>();
_list.Add(new {Prop1 = 45, Prop2 = "foo", Prop3 = 4.5});
_list.Add(new {Prop1 = 14, Prop2 = "bar", Prop3 = 3.1});
}
但是我现在有一个类型对象的列表,我不知道它的类型或元素的类型。
我想使用LINQ从列表中选择一些基于其属性的元素,例如找到所有()。 我该怎么做?创建POCO课程会更好吗?
答案 0 :(得分:7)
我现在有一个类型对象列表,我不知道它的类型或元素的类型。
使用object
作为元素类型的结果。您仍有多种选择:
var
来捕获匿名类型dynamic
并放弃静态类型检查第二个选项如下:
var list = (new[] {
new {Prop1 = 45, Prop2 = "foo", Prop3 = 4.5}
, new {Prop1 = 14, Prop2 = "bar", Prop3 = 3.1}
}).ToList();
...
var filtered = list.Where(x => x.Prop1==45).ToList();
第三个选项如下:
var filtered = _list
.Cast<dynamic>()
.Where(x => x.Prop1==45) // <<== No static type checking here
.Cast<object>()
.ToList();
答案 1 :(得分:2)
自C#7.0起,您还可以使用新的ValueTuple
s。
List<(int Prop1, string Prop2, double Prop3)> _list;
void CreateList()
{
_list = new List<(int Prop1, string Prop2, double Prop3)>();
_list.Add((45, "foo", 4.5)); // Positional
_list.Add((Prop1: 14, Prop2: "bar", Prop3: 3.1)); // Named
}
如果C#给出的默认名称足够,则可以在声明元组时省略名称。它们将被命名为Item1
,Item2
和Item3
。
List<(int, string, double)> _list;
void CreateList()
{
_list = new List<(int, string, double)>();
_list.Add((45, "foo", 4.5));
_list.Add((14, "bar", 3.1));
}
或
void CreateList()
{
_list = new List<(int, string, double)> {
(45, "foo", 4.5),
(14, "bar", 3.1)
};
}
按默认名称选择项目:
int i = _list[0].Item1;
将元组分解为局部变量int a; string b; double c;
var (a, b, c) = _list[0];
元组和匿名类型非常适合中间结果和本地使用。对于公共API,更喜欢POCO类,接口和结构。