IEnumerable <T>上的自定义扩展方法

时间:2019-11-01 05:20:52

标签: c# linq

在我的项目中,我们获得了不同的元素列表和数组,并且需要为这些列表和数组选择替代项,例如,如果我的列表包含

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

现在它可能是数百个元素的列表,我的问题是从上面的列表中选择替代项,例如,如果我可以配置一个接一个地选择,即car after that skip bat-mask and pick halloween-toys,这是我的首要任务,之后我就可以对其进行配置例如要在一个或两个项目之间跳过多少个项目,等等。

之所以使用它作为扩展名是因为它将在完整的应用程序内使用,而我只需要像var myList = toys.customExtensionMethods();这样的访问权限

4 个答案:

答案 0 :(得分:2)

您可以使用它:

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

答案 1 :(得分:2)

如果我没记错,那么在您的扩展方法中,您希望获取不传递Of skip值的数组元素。

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

答案 2 :(得分:0)

希望我能正确理解您的问题。您打算创建一个扩展方法,该方法采用输入“ 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

答案 3 :(得分:0)

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


         }
    }
}