排序列表<;字符串>;通过匹配的Enum';的名称值

本文关键字:Enum lt 列表 字符串 gt 排序 | 更新日期: 2023-09-27 17:57:38

有点不确定如何做到这一点。我需要以不同于文件服务器上显示的顺序显示文件列表。

我在想一种方法是根据匹配的枚举的名称值对字符串列表进行排序。

假设我有一个完整的字符串列表:

    List<string> filenames = new List<string>();

我有一个相关的枚举以特定的顺序显示文件:

    public enum ProcessWorkFlowOrder 
    {    
       File1,
       File3,
       File2           
    }

列表中的"文件名"字符串值将与枚举的名称完全匹配。

根据匹配的枚举值匹配和排序FileNames列表的最佳方式是什么?

排序列表<;字符串>;通过匹配的Enum';的名称值

如果文件名完全匹配,我不会使用枚举,而是使用另一个保序列表。

List<string> namesInOrder = ...
List<string> files = ...
var orderedFiles = from name in namesInOrder
                   join file in files 
                   on name equals file
                   select file;

Join保留了第一个序列的顺序,因此允许您使用它来排序第二个序列。

如果您已经有了枚举,并且不能像Anthony建议的那样将其更改为字符串列表,则可以使用以下方法:

var order = Enum.GetValues(typeof(ProcessWorkFlowOrder))
                .OfType<ProcessWorkFlowOrder>()
                .Select(x => new {
                                   name = x.ToString(),
                                   value = (int)x
                        });
var orderedFiles = from o in order
                   join f in filenames
                   on o.name equals f
                   orderby o.value
                   select f;

怎么样?

var orderedFilenames = filenames.OrderBy(
    f => (int)Enum.Parse(typeof(ProcessWorkFlowOrder), f));

然而,我不确定维护这个枚举是否是最好的方法,最好写一个函数来定义顺序算法,如果枚举不包含文件名怎么办。

使用TryParse 编辑

var orderedFilenames = filenames.OrderBy(f => {
       ProcessWorkFlowOrder parsed;
       int result = 0;
       if (Enum.TryParse<ProcessWorkFlowOrder>(f, out parsed))
           result = (int)parsed;
       return result;
    });

你会使用什么规则来构造枚举或顺序保持列表,或者顺序是否纯粹是任意的?