如何使用LINQ选择和转换List <t> </t>的子集

时间:2013-05-08 10:16:57

标签: c# linq generic-list

我有一个具有此结构的列表List<UserRoles> roles

{r:1,u:1,v:3},
{r:1,u:1,v:5},
{r:2,u:1,v:9},
{r:3,u:2,v:10}

我正在尝试写一个LINQ语句,它只过滤出值为1&amp;的“r”。 2并返回“v”s

的整数/字符串集合

这就是我想要做的事情,我的问题出现在我想要转换为仅包含相应“v”的部分。

 List<Int32> =  roles.Where(r => r.r == 1 || r.r == 2)
                     .Select(i => new Int32{id = i.v});

这不会编译为'id'未知的错误。

我需要的最终结果是:

List<Int32>

{v:3},
{v:5},
{v:9}

4 个答案:

答案 0 :(得分:5)

听起来像是需要int的列表:

 List<int> result = roles.Where(r => r.r == 1 || r.r == 2)
                         .Select(i => i.v)
                         .ToList();

如果您要过滤int列表,可以使用Contains方法避免大量||

var filters = new[] { 1, 2};

List<int> result = roles.Where(r => filters.Contains(r.r))
                        .Select(i => i.v)
                        .ToList();

或者您可能需要{v:9},您可以将匿名类型var关键字一起使用:

var result = roles.Where(r => filters.Contains(r.r))
                        .Select(i => new { i.v })
                        .ToList();

答案 1 :(得分:1)

我猜v已经是一个int了。 所以解决方案就像:

var result =  roles.Where(r => r.r == 1 || r.r == 2).Select(i => i.v).ToList();

答案 2 :(得分:1)

如果你想要的是一组匿名对象,请使用:

var res =  roles.Where(r => r.r == 1 || r.r == 2).Select(i => new{i.v}).ToList();

这将产生一个对象列表,其中包含一个名为v的属性。

如果您要查找整数列表,并且v在原始班级中是int,请使用此选项:

var res =  roles.Where(r => r.r == 1 || r.r == 2).Select(i => i.v ).ToList();
//                             note that there's no new here ^^^^^

答案 3 :(得分:0)

您使用了匿名类型,但之后在其前面添加了Int32这是非法的。

 List<Int32> results = roles.Where(r => r.r == 1 || r.r == 2)
                            .Select(i => new { i.v }).ToList();