检查多个键的多个值

时间:2018-02-04 06:56:35

标签: c# .net

我有一本字典:

Dictionary<string, object> person = new Dictionary<string, object>();

字典中的值是这样的:

person.Add("State", "Florida");
person.Add("Gender", "Male");
person.Add("Married", 1);
person.Add("SalaryUnderHundredDollar", 1)

我必须检查Person的上述属性,然后我必须给那个人一些方案。

我正在做以下事情:

List<int> listOfSchemesEligble = new List<int>();
if(person["State"].ToString() == "Florida" || person["State"].ToString() == "NewYork")
{
   listOfSchemesEligble.Add(100); 
}
if(person["Gender"].ToString() == "Male")
{
   listOfSchemesEligble.Add(110); 
}
if(Convert.ToBoolean(person["Married"]))
{
   listOfSchemesEligble.Add(200); 
}
if(Convert.ToBoolean(person["SalaryUnderHundredDollar"]))
{
   listOfSchemesEligble.Add(500); 
}

有没有更好的方法来做到这一点,因为除了这些之外我还有很多条件?

2 个答案:

答案 0 :(得分:2)

看来你应该创建一个Person类,它将保存一个人的属性:

public enum GenderType
{
   Male, Female, Unknown
}

public class Person
{
   public int PersonId {get;set;}
   public string State {get;set;}
   public GenderType Gender {get;set;}
   public bool Married {get; set}
   public bool SalaryUnderHundredDollar {get;set}
}

现在您可以创建Person类的实例并以强类型方式直接使用它们:

var person = new Person()
{ 
   State = "Florida", 
   Gender = GenderType.Male, 
   Married = true, 
   SalaryUnderHundredDollar = true 
};
if ( person.Married ) ...

有关详细信息,请参阅the documentation intro to classes。类是面向对象语言的基本构建块,因此将现实世界中的对象表示为具有适当属性的类是很自然的。

更新

正如您在评论中提到的,您的数据来自JSON。看起来它是用双花括号包裹的,但是内部的&#34;对象&#34;是JToken。您也可以将JToken反序列化为类:

var person = personFile.First.ToObject<Person>();

唯一的问题似乎是MarriedSalaryUnderHundredDollar是整数而不是布尔值,因此您必须将上面类中的属性类型更改为int

答案 1 :(得分:1)

您的实施需要更改。我可以想象下面的实现在可维护性+ OOP指南方面更好:

public class Person
{
    public string State { get; set; }
    public string Gender { get; set; }
    public bool Married { get; set; }   
    public bool SalaryUnderHundredDollar { get; set; }
}
public class SchemeBuilder
{
    public List<Func<int>> BuildScheme(Person person)
    {
        return new List<Func<int>>
        {
            ()=> person.State=="Florida" || person.State=="NewYork" ? 100 : 0,
            ()=> person.Gender=="Male" ? 110 : 0,
            ()=>person.Married ? 200 : 0,
            ()=>person.SalaryUnderHundredDollar ? 500 :0
        };
    }
}
public class TestClass
{
    public void Main()
    {
        Person person = new Person();
        person.State = "NewYork";
        person.Gender = "Female";
        person.Married = true;
        person.SalaryUnderHundredDollar = true;
        List<int> listOfSchemesEligble = new List<int>();
        var builder = new SchemeBuilder();

        var schemes = builder.BuildScheme(person);

        foreach(var scheme in schemes)
        {
            var eleigiblePoints = scheme();
            if (eleigiblePoints != 0)
                listOfSchemesEligble.Add(eleigiblePoints);
        }
    }
}

当然可以进一步重构。