LINQ之Select,SelectMany

返回LINQ大全首页

Select()

将序列中的每个元素投影到新表单。
MSDN

在我理解就是将处理过后的数据重新存到新的序列里。

using System.Linq;
using System.Collections;
using System.Collections.Generic;

class Program
{
    static void Main( string[] args )
    {
        int[] numbers = new int[] { 1, 2, 4, 7, 9 };

        IEnumerable<int> results = numbers.Select( value => value * 2 );

        string text = string.Empty;
        foreach( int value in results )
        {
            text += string.Format( "{0}, ", value );
        }

        System.Console.WriteLine( text );

        System.Console.ReadKey();
    }
}

2, 4, 8, 14, 18,

现在我们将目标类序列中的指定数据提取出来重新组成一个新的序列。

using System.Linq;
using System.Collections;
using System.Collections.Generic;

class Program
{
    private class Parameter
    {
        public int      ID      { get; set; }
        public float    Rate    { get; set; }
        public string   Name    { get; set; }
    }

    static void Main( string[] args )
    {
        Parameter[] parameters = new Parameter[]
        {
            new Parameter() { ID =  5, Rate = 0.0f, Name = "正一郎" },
            new Parameter() { ID = 13, Rate = 0.1f, Name = "清次郎" },
            new Parameter() { ID = 25, Rate = 0.0f, Name = "誠三郎" },
            new Parameter() { ID = 42, Rate = 0.3f, Name = "征史郎" },
        };

        IEnumerable<string> results = parameters.Select( value => value.Name );

        string text = string.Empty;
        foreach( string value in results )
        {
            text += string.Format( "{0}, ", value );
        }

        System.Console.WriteLine( text );

        System.Console.ReadKey();
    }
}

正一郎, 清次郎, 誠三郎, 征史郎,

Select()支持返回匿名类型。

using System.Linq;
using System.Collections;
using System.Collections.Generic;

class Program
{
    private class Parameter
    {
        public int      ID      { get; set; }
        public float    Rate    { get; set; }
        public string   Name    { get; set; }
    }

    static void Main( string[] args )
    {
        Parameter[] parameters = new Parameter[]
        {
            new Parameter() { ID =  5, Rate = 0.0f, Name = "正一郎" },
            new Parameter() { ID = 13, Rate = 0.1f, Name = "清次郎" },
            new Parameter() { ID = 25, Rate = 0.0f, Name = "誠三郎" },
            new Parameter() { ID = 42, Rate = 0.3f, Name = "征史郎" },
        };

        var results = parameters.Select( value => new { Number = value.ID * 2, Name = value.Name } );


        string text = string.Empty;
        foreach( var value in results )
        {
            text += string.Format( "[{0}]:{1}, ", value.Number, value.Name );
        }

        System.Console.WriteLine( text );

        System.Console.ReadKey();
    }
}

[10]:正一郎, [26]:清次郎, [50]:誠三郎, [84]:征史郎,

Foreach()很方便,但是却无法获得索引,而使用for循环又太麻烦,这时候我们也可以使用Select()实现需求。第二个参数index为索引。

using System.Linq;
using System.Collections;
using System.Collections.Generic;

class Program
{
    static void Main( string[] args )
    {
        string[] names = new string[] { "正一郎", "清次郎", "誠三郎", "征史郎" };

		//第二个参数index为索引
        var results = names.Select( ( value, index ) => new { Number = index, Name = value } );


        string text = string.Empty;
        foreach( var value in results )
        {
            text += string.Format( "[{0}]:{1}, ", value.Number, value.Name );
        }

        System.Console.WriteLine( text );

        System.Console.ReadKey();
    }
}

[0]:正一郎, [1]:清次郎, [2]:誠三郎, [3]:征史郎,

SelectMany()

将序列的每个元素投影到 IEnumerable 并将结果序列合并为一个序列。
MSDN

用来对多重嵌套的序列操作很方便。

using System.Linq;
using System.Collections;
using System.Collections.Generic;

class Program
{
    private class Parameter
    {
        public string   Name    { get; set; }
        public int[]    Numbers { get; set; }       
    }

    static void Main( string[] args )
    {
        Parameter[] parameters = new Parameter[]
        {
            new Parameter() { Name = "正一郎", Numbers = new int[] { 1, 2, 3 } },
            new Parameter() { Name = "清次郎", Numbers = new int[] { 1, 3, 5 } },
            new Parameter() { Name = "誠三郎", Numbers = new int[] { 2, 4, 6 } },
            new Parameter() { Name = "征史郎", Numbers = new int[] { 9, 8, 7 } },
        };

        IEnumerable<int> results = parameters.SelectMany( value => value.Numbers );

        string text = string.Empty;

        foreach( int value in results )
        {
            text += string.Format( "{0}, ", value );
        }

        System.Console.WriteLine( text );
        System.Console.ReadKey();
    }
}

1, 2, 3, 1, 3, 5, 2, 4, 6, 9, 8, 7,

重载的多参数方法大致看了一下还没理解,日后再补充。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值