【问题标题】:how to use enums for getting matched value如何使用枚举获取匹配值
【发布时间】:2013-09-05 14:20:41
【问题描述】:

这里我有一个方法,它将返回匹配的参数,只返回字符串作为返回类型,并且它工作正常......

    private static string GetSortedParameter(string modelValue)
    {
        string returnValue = null;
        if (modelValue == "UserId")
        {
            returnValue = "UsrID";

        }
        if (modelValue == "Status")
        {
            returnValue = "TransactionStatusTypeName";

        }
        if (modelValue == "ProjectCaseNumber")
        {
            returnValue = "PROJCASE";            
        }

        if (modelValue == "CP")
        {
            returnValue = "CPNumber";
        }
        if (modelValue == "ItemID")
        {
            returnValue = "ItemID";
        }
        if (modelValue == "TypeOfChange")
        {
            returnValue = "TransactionTypeName";
        }
        if (modelValue == "ChangeDescription")
        {
            returnValue = "TransactionTypeDescription";
        }
        if (modelValue == "CreatedOnEnd")
        {
            returnValue = "CreatedDateTime";
        }
        if (modelValue == "UpdatedOnEnd")
        {
            returnValue = "UpdatedDateTime";
        }
        if (modelValue == "Comment")
        {
            returnValue = "Comments";
        }

        return returnValue;

    }

我在这里调用这个方法

       if (request.Sorts != null && request.Sorts.Count > 0)
        {
            sortField = request.Sorts[0].Member;
            sortDirection = request.Sorts[0].SortDirection.ToString();
        }
         string SortFieldParameter = GetSortedParameter(sortField);

但是我想对这种类型使用枚举,我如何将枚举用于这种类型的匹配参数,它将一个值作为输入参数并给出匹配的值.....

请您对此提出任何想法和解决方案....

我也在为此寻找任何通用解决方案.....

【问题讨论】:

  • 拥有Dictionary<string, string> 并快速查找不是更容易吗?
  • 我想你想要一个switch 声明。
  • if statement使用不当使用switch of if-else if chain
  • Patryk Ćwiek 是最好的解决方案,即使您设置了枚举和 Dictionary<MyEnum, string>

标签: c# .net enums


【解决方案1】:

如果你在描述中没有使用空格,你可以用两个枚举和交叉转换来作弊。

enum ModelValue
{
    UserId = 1,
    Status = 2,
    ProjectCaseNumber = 3,
    CP = 4,
    ItemId = 5,
    TypeOfChange = 6,
    ChangeDescription = 7,
    CreatedOnEnd = 8,
    UpdatedOnEnd = 9,
    Comment = 10
}

 enum SortedParameters {
        CUsrID = 1,
        TransactionStatusTypeName = 2,
        PROJCASE = 3,            
        CPNumber = 4,
        ItemID = 5,
        TransactionTypeName = 6,
        TransactionTypeDescription = 7,
        CreatedDateTime = 8,
        UpdatedDateTime = 9,
        Comments = 10
 }

那么你只需要

string GetSortedParameter(string value) {
  ModelValue modelValue;
  if (Enum.TryParse(value, out modelValue)) {
    return ((SortedParameters)(int)modelValue).ToString();
  }
  throw new ArgumentOutOfRangeException("Not a valid value");
}

你为什么要使用 Enums 不是很清楚,还是你想让 GetSortedParameter 返回一个 Enum?

SortedParameters GetSortedParameter(string value) {
  ModelValue modelValue;
  if (Enum.TryParse(value, out modelValue)) {
    return (SortedParameters)(int)modelValue;
  }
  throw new ArgumentOutOfRangeException("Not a valid value");
}

但是,您是否只是想要字符串到字符串的转换Dictionary<string,string> 会好得多。

 static Dictionary<string,string> ModelToSortedParameter = new Dictionary<string,string> {
    { "UserId", "CUsrID" },
    { "Status", "TransactionStatusTypeName" },
    # <and so on...>
 }

那你就做吧

    SortFieldParameter = ModelToSortedParameter[sortField]; 

如果你想优雅地处理缺失值,你可以在一个带有键检查的函数中实现这一点。

这个解决方案也同样适用于字符串到枚举

static Dictionary<string,SortedParameters> ModelToSortedParameter = new Dictionary<string,SortedParameters> {
    { "UserId", SortedParameters.CUsrID },
    { "Status", SortedParameters.TransactionStatusTypeName },
    # <and so on...>
 }

【讨论】:

    【解决方案2】:

    先这样做

    enum ModelValue
    {
        UserId,
        Status,
        ProjectCaseNumber,
        CP,
        ItemId,
        TypeOfChange,
        ChangeDescription,
        CreatedOnEnd,
        UpdatedOnEnd,
        Comment
    }
    

    然后这个

    private static string GetSortedParameter(ModelValue value)
    {
        switch(value)
        {
            case ModelValue.UserId:
                return "CUsrID";
    
            case ModelValue.Status:
                return "TransactionStatusTypeName";
    
            case ModelValue.ProjectCaseNumber:
                return "PROJCASE";            
    
            case ModelValue.CP:
                return "CPNumber";
    
            case ModelValue.ItemId:
                return "ItemID";
    
            case ModelValue.TypeOfChange:
                return "TransactionTypeName";
    
            case ModelValue.ChangeDescription:
                return  "TransactionTypeDescription";
    
            case ModelValue.CreatedOnEnd:
                return "CreatedDateTime";
    
            case ModelValue.UpdatedOnEnd:
                return "UpdatedDateTime";
    
            case ModelValue.Comment:
                return "Comments";
    
            default:
                throw new ArgumentOutOfRangeException("value");
        }
    }
    

    switch 将比Dictionary 执行得更快,考虑到Dictionary 实例化后的代码量大致相同。

    如果直到运行时才知道这些值,则使用Dictionary


    如果由于某种原因,“Sort”不能有 MemberModelValue,而必须是 string,您可以像这样更改 GetStoredParamter

    private static string GetStoredParameter(string value)
    {
        switch(value)
        {
            case "UserId":
                return "CUsrID";
    
            case "Status":
                return "TransactionStatusTypeName";
    
            ...
        }
    }
    

    【讨论】:

    • 我如何在这里调用if (request.Sorts != null &amp;&amp; request.Sorts.Count &gt; 0) { sortField = request.Sorts[0].Member; sortDirection = request.Sorts[0].SortDirection.ToString(); } string SortFieldParameter = GetSortedParameter(sortField); 的方法,而我在 switch 语句中遇到错误,例如 UserId is not available in current context ....
    • @BobVale 模型值来自这个方法sortField = request.Sorts[0].Member;,我只需要将一个字符串值传递给这个......就像这个 GetSortedParameter(value)
    • @pratapk,我编辑向您展示如何使用带字符串的开关/案例
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多