簡體   English   中英

IEnumerable 上的自定義擴展方法<t></t>

[英]Custom extension methods on IEnumerable<T>

在我的項目中,我們得到了不同的元素列表和數組,並且需要為這些列表和數組選擇替代方案,例如,如果我的列表包含

string[] toys= { "car", "bat-mask", "halloween-toys", "marvel-toys", "transformer" };

現在它可能是數百個元素的列表,我的問題是從上面的列表中選擇替代方案,例如,如果我有配置來一個接一個地選擇,即car after that skip bat-mask and pick halloween-toys這是我的首要任務,然后我讓它可配置,比如在一個項目或兩個項目之間跳過多少項目等。

使用它作為擴展的原因,因為它將在完整的應用程序中使用,我只需要像var myList = toys.customExtensionMethods();一樣訪問它

你可以使用它:

using System.Linq;

static public class IEnumerableHelper
{
  static public IEnumerable<T> customExtensionMethods<T>(this IEnumerable<T> items, 
                                                         T takeFirst, 
                                                         int skipCount)
  {
    var list1 = items.SkipWhile(item => !item.Equals(takeFirst));
    var list2 = list1.Skip(skipCount + 1).Take(1);
    return list1.Take(1).Concat(list2);
  }
}

測試 1

static void Test()
{
  string[] toys = { "car", "bat-mask", "halloween-toys", "marvel-toys", "transformer" };
  var list = toys.customExtensionMethods("car", 1);
  foreach ( var item in list )
    Console.WriteLine(item);
}

Output:

car
halloween-toys

測試 2

var list = toys.customExtensionMethods("bat-mask", 2);

Output

bat-mask
transformer

如果我沒記錯的話,在您的擴展方法中,您想要獲取沒有傳遞跳過值的數組元素。

   public static class ExtensionMethod
    {
        public static string[] CustomExtensionMethods(this string[] myData, int NoofSkip)
        {
            var newData = new List<string>();
            for (int i = 0; i < myData.Length; i++ )
            {
                newData.Add(myData[i]);
                i = i + NoofSkip;
            }

            return newData.ToArray();
        }
    }

調用方法:

var data = toys.CustomExtensionMethods(1);

OutPut:

 { "car", "halloween-toys", "transformer" };

我希望我正確理解了你的問題。 您打算創建一個擴展方法,該方法采用輸入“搜索詞”和計數跳過計數。 該方法在列表中搜索項目,跳過接下來的 n 個項目並返回新項目。 您可以執行以下操作。

public static class Extensions
{
    public static T PickAlternative<T>(this IEnumerable<T> source,string item,int skipCount)
    {
        return source.SkipWhile(x=> !x.Equals(item)).Skip(skipCount).First();
    }
}

例子,

toys.PickAlternative("bat-mask",3);
toys.PickAlternative("car",2);

Output

transformer
halloween-toys
public static class EnumerableExtensions
{
    public static IEnumerable<T> PickAlternate<T>(this IEnumerable<T> source, int skip)
    {
        int? currentlySkipped = null;

        foreach (var item in source)
        {
            if (!currentlySkipped.HasValue || currentlySkipped == skip)
            {
                currentlySkipped = 0;
                yield return item;
            }
            else
            {
                currentlySkipped++;
            }


         }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM