将 List<T> 自定义为 ListCustomMinIndexedForEach<T> 的问题(从不相关的实现中剥离)

Posted

技术标签:

【中文标题】将 List<T> 自定义为 ListCustomMinIndexedForEach<T> 的问题(从不相关的实现中剥离)【英文标题】:issues customizing List<T> into ListCustomMinIndexedForEach<T> (stripped from irelevant implementations) 【发布时间】:2016-06-02 20:53:07 【问题描述】:

我尽量保持标题简短但仍能提供信息。

我想我大部分都成功了

我现在的问题:(以下 TLDR)

我无法成功实现公共 void 方法成员,也无法成功实现自定义 ForEach() with index..

作为扩展

    public static ListWithCounter<T> ForEach<T>(this  ListWithCounter<T> Self, Action<T> itm)//, ListWithCounter<T> l = l.CurId)
    

        for (int i = 0; i < Self.Count; i++)
        
            Self.CurId = i;
            itm(Self[i]);Self.CurId++;

        
        return Self;
    

我猜这是一个小问题,目标

创建自定义列表没有花哨的额外(昂贵)方法

添加一个优雅的 ForEach 实现

开箱即用的可选技巧GetEnumValues/names . ToourCustomList()

用法

在本例中,我使用的是Enum(操作名称也用于在控制台菜单中显示操作项)

public enum ActSrptS  CreateMmfTfomFile_DoFormat, OpenExitMmfT, .... 

所以我通过释放那个小 List 类的力量将它打印到控制台

                                    //a struct ConsoleModifiers + ConsoleKey
ActScrptS aAction = ActScrptS._Start; Combination Comb = new Combination();
var actS = aAction._EnmGetValues();
var actSNms = aAction.EnumGetNamesToList().ForEach(Act =>

   Console.WriteLine("[0]1", actS.CurId, Act);
);
Console.WriteLine("===============\r\n");
Console.WriteLine("please Select Action");

它只是在使用(现在尝试没有成功..)

public static ListWithCounter<string> EnumGetNamesToList(this Enum selfEnum)

    return selfEnum.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)
            .Select(f=>f.Name).ToList();
        //var values = Enum.GetNames(typeof(selfEnum)).ToList();
            //return values;
        //var values = Enum.GetValues(typeof(Environment.SpecialFolder)).Cast<Environment.SpecialFolder>().ToList();





public static ListWithCounter<Enum> _EnmGetValues(this Enum Self)

    ListWithCounter<Enum> enumerations = new ListWithCounter<Enum>();
    foreach (FieldInfo fieldInfo in Self.GetType().GetFields(
              BindingFlags.Static | BindingFlags.Public))
        
            enumerations.Add((Enum)fieldInfo.GetValue(Self));
        
    return enumerations;

所以我从MSDN List.cs开始

我尝试尽可能少地实现方法

保留最少的重要功能 更改增长/扩展以实现最小复制,因此启动容量为 10-50,每个限制乘以 *4...

出来这个CODE

【问题讨论】:

【参考方案1】:

我终于想到了这个

var actS = aActionCur._EnmGetValues().GetAsActionList();


actS.ForEach(act => Console.WriteLine("action [0] 1", actS.CurId, act));
//which is using....v
public static ListWithCounter<Enum> _EnmGetValues(this Enum Self)

    ListWithCounter<Enum> enumerations = new ListWithCounter<Enum>();
    foreach (FieldInfo fieldInfo in Self.GetType().GetFields(
              BindingFlags.Static | BindingFlags.Public))
    
            enumerations.Add((Enum)fieldInfo.GetValue(Self));
    
        return enumerations;



//which is using....v
public static ListWithCounter<T> ForEach<T>(this  ListWithCounter<T> Self, Action<T> itm)

        for (int i = 0; i < Self.Count; i++)
        

            itm(Self[i]); Self.CurId++;
        
        return Self;

结局更好

    public static ListWithCounter<ConsoleColor> GetAsConColors(this ListWithCounter<Enum> self)
    
        return self[0].GetType().GetEnumValues().Cast<ConsoleColor>().ToList();
    

[1] 红色

[2] 蓝色 ... ....

.....

抓住用户键,你有一个单行控制台菜单

【讨论】:

【参考方案2】:

为什么不使用一些不错的LINQ

public class Program

    public enum ActSrptS  CreateMmfTfomFile_DoFormat, OpenExitMmfT 

    private static void Main()
    
        var action = ActSrptS.OpenExitMmfT;

        Enum.GetValues(action.GetType())
            .OfType<ActSrptS>()
            .Select((v, i) => $"[i + 1] v")
            .ToList()
            .ForEach(Console.WriteLine);

        Console.WriteLine("===============\r\n");
        Console.WriteLine("Please select Action");

    

【讨论】:

以上是关于将 List<T> 自定义为 ListCustomMinIndexedForEach<T> 的问题(从不相关的实现中剥离)的主要内容,如果未能解决你的问题,请参考以下文章

Java8自定义条件让集合分组

C# 将Object类转化为List<T>类,其中T的类型不是object类型。

WPF - 将 List<T> 绑定为 WrapPanel 的内容

winForms + DataGridView 绑定到 List<T>

如何使用自定义 JSF 转换器将 h:selectOneMenu 项转换为 List<String>?

Java 流:将 List<T> 转换为 List<List<T>>