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);
}

输出:

car
halloween-toys

测试2

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

输出

bat-mask
transformer

如果我没有错,在您的扩展方法中,您希望获得不传递Of跳过值的数组元素。

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);

输出:

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

我希望我能正确理解你的问题。您打算创建一个接受输入"searchterm"和计数跳过计数的扩展方法。该方法搜索列表中的项目,跳过接下来的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);

输出

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++;
}

}
}
}

最新更新