通过匹配的Enum的名称值</string>对List <string>进行排序

时间:2011-05-24 15:26:56

标签: c# linq list enums matching

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

我在想一种方法是通过匹配的枚举名称值来排序字符串列表。

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

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

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

    public enum ProcessWorkFlowOrder 
    {    
       File1,
       File3,
       File2           
    }

List中的“filenames”字符串值将与Enum的名称完全匹配。

通过匹配的枚举值匹配和排序FileNames列表的最佳方法是什么?

3 个答案:

答案 0 :(得分:5)

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

List<string> namesInOrder = ...
List<string> files = ...

var orderedFiles = from name in namesInOrder
                   join file in files 
                   on name equals file
                   select file;

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

答案 1 :(得分:3)

如果您已经拥有枚举,并且无法将其更改为像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;

答案 2 :(得分:1)

怎么样?

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

您将使用哪些规则来构建枚举或订单保留列表,或者该命令是纯粹的仲裁?