如何在另一个列表中的两个属性上创建List <int> basead?

时间:2016-04-19 18:17:33

标签: c# linq list

问题

我需要在另一个列表中的两个属性上创建一个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);
}

提前致谢,对不起,我的英语很差。

2 个答案:

答案 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的评论中所述。