iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 24
2
Software Development

深入探索LINQ系列 第 24

C#的利器LINQ-Skip的應用

今天要說的方法是Skip,就是可以忽略部分元素的方法,我們在處理資料時可能會有某些資料不想要輸出的需求,這時就可以用Skip來達成,現在我們來看看Skip要怎麼使用。

功能說明

設定要忽略的元素數量(SkipSkipLast)或是條件(SkipWhile),回傳的集合就不會包含其忽略的元素。

方法定義

Skip有三種不同名稱的方法: SkipSkipLastSkipWhile,它們的差別可以用下圖來說明:

https://ithelp.ithome.com.tw/upload/images/20180113/20107789AABIUBX6jc.png

我們看圖說故事:

  • Skip: 由集合的第一個元素開始記數,到達指定的數量為止的元素都忽略不算在結果集合中
  • SkipLast: 由集合的最後個元素往前記數,到達指定的數量為止的元素都忽略不算在結果集合中
  • SkipWhile: 集合中符合條件的元素忽略,碰到第一個不符合條件的元素及其之後的元素都回傳

看完上面的例子應該會比較清楚三個Skip的差別,接著我們依序來看方法定義。

Skip

public static IEnumerable<TSource> Skip<TSource>(
    this IEnumerable<TSource> source,
    int count);
  • count: 要忽略的元素數量

Skip是回傳忽略第1個到第count個元素的集合。

SkipLast

public static IEnumerable<TSource> SkipLast<TSource>(
    this IEnumerable<TSource> source,
    int count);
  • count: 要忽略的元素數量

SkipLast是回傳忽略最後1個元素數來count個元素的集合。

SkipWhile

public static IEnumerable<TSource> SkipWhile<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate);

public static IEnumerable<TSource> SkipWhile<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, int, bool> predicate);
  • predicate: 判斷式,如果符合判斷是傳回true的話則忽略此元素,反之遇到false條件後的所有元素都保留
  • 第二個方法predicate多傳入index參數為元素的位置

SkipWhile是回傳不符合predicate條件的元素及其後的所有的元素

方法範例

顏色

依照上面的圖片的範例寫成方法

string[] color = new string[] { "Orange", "Blue", "Yellow", "Green", "Pink" };

IEnumerable<string> skipResults = color.Skip(3);
IEnumerable<string> skipLastResults = color.SkipLast(3);
IEnumerable<string> skipWhileResults = color.SkipWhile(x => x != "Yellow");

Dictionary<string, IEnumerable<string>> results = new Dictionary<string,IEnumerable<string>>(){
    { "Skip", skipResults },
    { "SkipLast", skipLastResults },
    { "SkipWhile", skipWhileResults }
};

string output = "";
foreach (KeyValuePair<string, IEnumerable<string>> keyValue in results)
{
    output += $"{keyValue.Key}: ";
    foreach (string c in keyValue.Value)
    {
        output += $"{c},";
    }
    output = output.Trim(',') + '\n';
}
Console.WriteLine(output);

輸出結果如下:

/*
 * Skip: Green,Pink
 * SkipLast: Orange,Blue
 * SkipWhile: Yellow,Green,Pink
 */

特別之處

  • 延遲執行的特性,在GetEnumerator()或是foreach叫用後才會執行
  • 沒有查詢運算式
  • SkipSkipLast指定的count數量大於集合數量,則傳回集合
  • SkipSkipLast指定的count數量小於等於零,則傳回完整的集合
  • SkipWhilepredicate對所有元素都傳回true,則回傳集合

範例程式

參考


上一篇
C#的利器LINQ-GroupJoin的原碼探索
下一篇
C#的利器LINQ-Skip的原碼探索
系列文
深入探索LINQ30

尚未有邦友留言

立即登入留言