问题
我需要在另一个列表中的两个属性上创建一个List<int>
basead。
示例
我的课程有两个我需要的字段。
public class MyClass
{
//Other fields
int? ValueId
int? ValueTwoId
}
上面的代码就是一个例子,所以不要专注于那里。
我想检索以下属性:
myClassList.ElementAt(0).ValueId = 1;
myClassList.ElementAt(0).ValueTwoId = 2;
myClassList.ElementAt(1).ValueId = 3;
myClassList.ElementAt(1).ValueTwoId = 4;
List<int> resultList = myClassList.Where(x => x.ValueId != null && x.ValueTwoId != null).Select(x => ??).ToList());
所需输出
resultList.ElementAt(0) == 1
resultList.ElementAt(1) == 2
resultList.ElementAt(2) == 3
resultList.ElementAt(3) == 4
使用.Select(x => Something ).ToList()
可以实现此目的,而无需使用以下代码:
List<int> resultList = new List<int>();
foreach(var item in myClassList)
{
resultList.Add(item.ValueId);
resultList.Add(item.ValueTwoId);
}
提前致谢,对不起,我的英语很差。
答案 0 :(得分:4)
尝试
List<int> resultList = myClassList
.Where(x => x.ValueId != null && x.ValueTwoId != null)
.SelectMany(x => new List<int>{x.ValueId.Value, x.ValueTwoId.Value})
.ToList();
如:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
internal class Program
{
public static void Main(string[] args)
{
var myClassList = new List<MyClass> {new MyClass(), new MyClass()};
myClassList.ElementAt(0).ValueId = 1;
myClassList.ElementAt(0).ValueTwoId = 2;
myClassList.ElementAt(1).ValueId = 3;
myClassList.ElementAt(1).ValueTwoId = 4;
var resultList = myClassList
.Where(x => x.ValueId != null && x.ValueTwoId != null)
.SelectMany(x => new List<int> { x.ValueId.Value, x.ValueTwoId.Value})
.ToList();
foreach (var i in resultList)
{
Console.WriteLine(i);
}
//Prints out:
//1
//2
//3
//4
Console.ReadLine();
}
public class MyClass
{
public int? ValueId;
public int? ValueTwoId;
}
}
}
答案 1 :(得分:2)
var result = from x in myClassList
from sub in new[] { x.ValueId, x.ValueTwoId }
where sub.HasValue
select sub.Value;
我不清楚您是否因为x.ValueIdTwoId
x.valueId
而放弃null
。如果是这种情况,请使用
var result = from x in myClassList
from sub in new[] { x.ValueId, x.ValueTwoId }
where x.ValueId.HasValue && x.ValueTwoId.HasValue
select sub.Value;
代替。
正如其他人所说,你需要的是LINQ的SelectMany
操作。上面的代码示例中的from
会转换为SelectMany
,如Enumerable.SelectMany Method on MSDN的评论中所述。