LINQ之Skip,SkipWhile

返回LINQ大全首页

目录

  • Skip()
  • SkipWhile()
  • SkipWhile()和Where()的区别

Skip()

如果我不需要此数组的第一个元素,那么有没有办法只删除第一个元素并得到其余的元素?
Skip()就是为了解决这种情况而存在的。
如果您从头开始指定不需要的元素数目,则将返回该数目之后的元素序列。
MSDN
public static IEnumerable Skip( this IEnumerable source, int count );

代码示例:

public static class Program
{
    static void Main( string[] args )
    {
        int[]       numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        string[]    texts   = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

        // 跳过开始的3个
        IEnumerable<int>    skippedNumbers  = numbers.Skip( 3 );
        // 跳过开始的4个
        IEnumerable<string> skippedTexts    = texts.Skip( 4 );

        System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() );
        System.Console.WriteLine( "skippedTexts:{0}",   skippedTexts.Text() );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
} 

skippedNumbers:[3], [4], [5], [6], [7], [8], [9],
skippedTexts:[Thu], [Fri], [Sat],

如果将大于总数的数字或负数传递给此参数,它也会正常工作。
具体效果看下面案例。

示例代码:

public static class Program
{
    static void Main( string[] args )
    {
        int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        string[]    texts   = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

        // 超过总数
        IEnumerable<int>    skippedNumbers  = numbers.Skip( 100 );
        // 跳过负数
        IEnumerable<string> skippedTexts    = texts.Skip( -5 );

        System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() );
        System.Console.WriteLine( "skippedTexts:{0}",   skippedTexts.Text() );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
} 

skippedNumbers:
skippedTexts:[Sun], [Mon], [Tue], [Wed], [Thu], [Fri], [Sat],

由此我们可以发现,参数为负数时会获取所有元素,参数大于元素总数获取不到元素。

SkipWhile()

Skip()可以指定跳过的数目。
但是您可能需要指定特定的跳过条件,而不是元素数。在这种情况下就可以使用SkipWhile()
您可以在参数中设置跳过的条件
MSDN
public static IEnumerable SkipWhile( this IEnumerable source, Func predicate );
它将跳过满足条件的元素
在下面的示例中,使用lambda表达式描述了条件语句。

代码示例:

public static class Program
{
    static void Main( string[] args )
    {
        int[]       numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        string[]    texts   = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

        // 小与7的
        IEnumerable<int>    skippedNumbers  = numbers.SkipWhile( value => value < 7 );
        // 删除尾字母为n的
        IEnumerable<string> skippedTexts    = texts.SkipWhile( value => value.EndsWith( "n" ) );

        System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() );
        System.Console.WriteLine( "skippedTexts:{0}",   skippedTexts.Text() );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
} 

skippedNumbers:[7], [8], [9],
skippedTexts:[Tue], [Wed], [Thu], [Fri], [Sat],

当您使用SkipWhile()指定要跳过的条件时,不仅可以获取每个元素的信息,还可以获取每个元素的索引值。

public static IEnumerable SkipWhile( this IEnumerable source, Func predicate );

在以下示例中,index索引号作为参数在lambda表达式条件语句中传递。

代码示例:

public static class Program
{
    static void Main( string[] args )
    {
        int[]       numbers = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
        string[]    texts   = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

        // value值 * 索引值小于20
        IEnumerable<int>    skippedNumbers  = numbers.SkipWhile( ( value, index ) => value * index < 20 );
        // value的长度大于索引值
        IEnumerable<string> skippedTexts    = texts.SkipWhile( ( value, index ) => value.Length > index );

        System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() );
        System.Console.WriteLine( "skippedTexts:{0}",   skippedTexts.Text() );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
} 

skippedNumbers:[5], [4], [3], [2], [1], [0],
skippedTexts:[Wed], [Thu], [Fri], [Sat],

SkipWhile()和Where()的区别

SkipWhile()和LINQ函数中的Where()类似。
MSDN
public static IEnumerable Where( this IEnumerable source, Func predicate );

Where()是与条件具有相同元素的函数。
让我们将此Where()与SkipWhile()进行比较。

在下面的示例中,描述了省略低于指定数值的元素的条件。

代码示例:

public static class Program
{
    static void Main( string[] args )
    {
        int[]   numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        // 值小于5
        IEnumerable<int>    skippedNumbers  = numbers.SkipWhile( value => value < 5 );
        // 值大于等于5
        IEnumerable<int>    whereNumbers    = numbers.Where( value => value >= 5 );

        System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() );
        System.Console.WriteLine( "whereNumbers  :{0}",   whereNumbers.Text() );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
} 

skippedNumbers:[5], [6], [7], [8], [9],
whereNumbers :[5], [6], [7], [8], [9],

得到了相同的结果。
前面我们使用的是有组织的数据,其中作为数据的值按升序排列。
现在,让我们打乱此数据序列,然后再次进行验证。

代码示例:

public static class Program
{
    static void Main( string[] args )
    {
        int[]   numbers = new int[] { 0, 3, 6, 1, 4, 5, 8, 7, 2, 9 };
        // 值小于5
        IEnumerable<int>    skippedNumbers  = numbers.SkipWhile( value => value < 5 );
        // 值大于等于5
        IEnumerable<int>    whereNumbers    = numbers.Where( value => value >= 5 );

        System.Console.WriteLine( "skippedNumbers:{0}", skippedNumbers.Text() );
        System.Console.WriteLine( "whereNumbers  :{0}",   whereNumbers.Text() );

        System.Console.ReadKey();
    }

    public static string Text<TSource>( this IEnumerable<TSource> i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }
} 

skippedNumbers:[6], [1], [4], [5], [8], [7], [2], [9],
whereNumbers :[6], [5], [8], [7], [9],

结果变更。
Where(),移除所有符合条件的元素,并返回其他元素。
SkipWhile(),从头开始算,遇到符合条件的的元素就移除,遇到不符合条件的直接结束,无论后续有没有符合条件的元素。

因此,Where()的结果是返回所有不小于5的所有元素。
SkipWhile()的结果是移除从头开始小于5的元素。如遇到不满足条件的则直接停止

你可能感兴趣的:(C#,.net,c#,linq,microsoft,unity)