我有一个属性值,然后我想在一个数组中通过这个属性值找到这个变量在数组中的位置,即属性值为该值的变量名,我希望能像数组序号一样的得到,而不是去遍历数组进行匹配得到,不知道是不是有办法办到,还望各位不吝赐教,小弟先在此谢过,谢谢!

解决方案 »

  1.   


     ///   <summary> 
            ///   设置对象属性的值 
            ///   </summary> 
            ///   <param   name= "obj "> 对象 </param> 
            ///   <param   name= "name "> 属性名称 </param> 
            ///   <param   name= "value "> object值 </param> 
            protected   void   SetPropertyInfo(object   obj,   string   name,object   value) 
            { 
                    Type   t   =   obj.GetType(); 
                    PropertyInfo   pInfo   =   t.GetProperty(name);                 
                    
                    Response.Write( "pInfo   "   +   pInfo.GetType()); 
                    Response.Write( " <br> "); 
                    Response.Write( "pInfo   "   +   t.GetType()); 
                    Response.Write( " <br> "); 
                    Response.Write( "value   "   +   value.GetType()); 
                    Response.Write( " <br> "); 
                    Response.Write( " <br> ");                 pInfo.SetValue(obj,   value,   null);                 
            } 
    转自:http://topic.csdn.net/u/20071114/22/eb8129c3-6f28-4a9a-a12e-5bf34fbf1aac.html?1083852357
      

  2.   

    代码如下,写了不好,见笑了。 /// <summary>
    /// 公式预处理
    /// </summary>
    /// <param name="formula">公式</param>
    /// <param name="name">名称</param>
    /// <param name="value">对应值</param>
    /// <returns>公式计算结果</returns>
    private static decimal Regular(string formula, string[] name, decimal[] value)
    {
    for (int i = 0; i < name.Length; i++)
    {
    formula = formula.Replace(name[i], value[i].ToString());
    } char[] chs = formula.ToCharArray();
    string[] strs=new string[chs.Length];
    for(int i=0;i<chs.Length;i++)
    {
    strs[i] = chs[i].ToString();
    }
    Stack Digital = new Stack();//存储数字
    Stack Operator = new Stack();//存储运算符
    string operaters = "+-*/()%";
    foreach (string str in strs)
    {
    if (str.Equals(string.Empty)) continue;//如果为空继续 if (operaters.IndexOf(str) != -1)//是操作符
    {
    if (str.Equals("("))
    {
    Operator.Push(str);//进栈
    }
    else
    {
    Calculat(Digital, Operator, str);
    } }
    else//不是操作符
    {
    Digital.Push(decimal.Parse(str));
    }
    }
    if (Operator.Count != 0) Calculat(Digital, Operator, ")");//计算栈中剩余部分
    return (decimal)Digital.Pop();
    } /// <summary>
    /// 计算
    /// </summary>
    /// <param name="str">操作符</param>
    private static void Calculat(Stack Digital, Stack Operator, string str)
    {
    if (Operator.Count == 0)
    {
    Operator.Push(str);
    return;//已经没有运算符了
    }
    string prev = (string)Operator.Peek();
    if (prev == null || prev.Equals(string.Empty)) return;//元素不存在
    if (prev.Equals("("))
    {
    if (str.Equals(")"))
    {
    Operator.Pop();//移除操作符
    return;
    }
    else
    {
    Operator.Push(str);//进栈
    }
    }
    else
    if (compareOperater(str) <= compareOperater(prev))//第一个操作符等级小于等于第二个,则进行运算
    {
    Operator.Pop();//移除操作符 switch (prev)
    {
    case "+"://进行加操作
    {
    decimal num1 = (decimal)Digital.Pop();//返回第一个元素
    decimal num2 = (decimal)Digital.Pop();//返回第二个元素
    Digital.Push(num2 + num1);
    }
    break;
    case "-":
    {
    decimal num1 = (decimal)Digital.Pop();//返回第一个元素
    decimal num2 = (decimal)Digital.Pop();//返回第二个元素
    Digital.Push(num2 - num1);
    }
    break;
    case "*":
    {
    decimal num1 = (decimal)Digital.Pop();//返回第一个元素
    decimal num2 = (decimal)Digital.Pop();//返回第二个元素
    Digital.Push(num2 * num1);
    }
    break;
    case "/":
    {
    decimal num1 = (decimal)Digital.Pop();//返回第一个元素
    decimal num2 = (decimal)Digital.Pop();//返回第二个元素
    Digital.Push(num2 / num1);
    }
    break;
    case "%":
    {
    decimal num1 = (decimal)Digital.Pop();//返回第一个元素
    Digital.Push(num1 / 100);
    }
    break;
    }
    Calculat(Digital, Operator, str);//继续比较
    }
    else
    {
    Operator.Push(str);//进栈
    }
    }
    /// <summary>
    /// 运算符级别
    /// </summary>
    /// <param name="operater">操作符</param>
    /// <returns></returns>
    private static  int compareOperater(string operater)
    {
    string str3 = "(";
    string str2 = "*/%";
    string str1 = "+-";
    string str0 = ")";
    if (str0.IndexOf(operater) != -1) return 0;//零级运算符
    if (str1.IndexOf(operater) != -1) return 1;//一级运算符
    if (str2.IndexOf(operater) != -1) return 2;//二级运算符
    if (str3.IndexOf(operater) != -1) return 3;//三级运算符
    return -1;
    }
    static void Main(string[] args)
    {
    //公式
    string formula = "C*2-B+L"; //这边上下关系对应,送C=3之类的也可以,做个转换
    string[] name = new string[] { "C", "B", "L" };
    decimal[] value = new decimal[]{ 3, 5, 3};
    //完成表达式计算
    decimal Y = Regular(formula, name, value);
    for(int i=0;i<name.Length;i++)
    Console.WriteLine("{0}={1}", name[i], value[i]);
    Console.WriteLine("Y={0}={1}",formula,Y);
    Console.ReadLine();
    }