![](/img/trans.png)
[英]How do I get my IEnumerable<T> extension methods on an IEnumerable?
[英]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.