![](/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.