在我的项目中,我们得到了不同的元素列表和数组,需要为这些列表和数组选择替代方案,例如,如果我的列表由组成
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++;
}
}
}
}