使用LINQ for type of object object

时间:2017-12-23 15:55:11

标签: c# linq

我有一个类型对象列表

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课程会更好吗?

2 个答案:

答案 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#给出的默认名称足够,则可以在声明元组时省略名称。它们将被命名为Item1Item2Item3

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类,接口和结构。