繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM