如何在c#方法中返回2个值

时间:2011-12-20 03:28:52

标签: c#

我创建了c#的功能来比较我项目中的价格。

public static decimal? SpecialPrice(decimal w, decimal p)
{
    if (w < p)
    {
        return p;
    }
    else if (w > p && p > 0)
    {
        //return (w , p);
    }
    else
    {
        return w;
    }
}

我希望在w&gt;时返回两个变量(w和p) p和p> 0,但我不知道怎么能这样回来。有人知道吗?

8 个答案:

答案 0 :(得分:8)

您将多个值返回给调用代码的选择是:

  1. Out params
  2. Ref params
  3. 返回包含多个值的结构/对象,或其他类型的集合
  4. 基本上,#1和#2允许您使用方法参数将值传递回调用代码。在此处查看示例&amp;参考:

    http://msdn.microsoft.com/en-us/library/ee332485.aspx(out params)

    http://msdn.microsoft.com/en-us/library/14akc2c7.aspx(ref params)

    对于#3,您将使用与decimal?不同的返回值。例如,您可以声明一个具有两个属性的类,并返回该实例。或者返回List<decimal>或其他可以包含多个值的类型。

    我不清楚代码的意图是什么,因此您需要确定哪种方法最适合您。

答案 1 :(得分:6)

在C#中,您无法从方法返回两个值。最好两个返回一个数组或一些集合类型,它允许保存的值多于一个。

也许是这样的:

public static decimal[] SpecialPrice(decimal w, decimal p)
{
   if (w < p)
   {
      return new decimal[] { p };
   }
   else if(w > p && p > 0)
   {
       return new decimal[] { w, p };
   }
   else
   {
       return new decimal[] { w };
   }
}

如果知道在执行此方法后哪个值是重要的,则可以使用更复杂的集合类,如Dictionary类,它允许您按名称引用其每个值。

我不会在这种情况下创建一个新的结构或类,因为我认为在调用此方法之前,数组大小很容易指示返回多少个值,其中类和结构将具有相同数量的变量。之后,更难以判断返回了多少值。

答案 2 :(得分:6)

您可以使用Tuple

public static Tuple<decimal?, decimal?> SpecialPrice(decimal w, decimal p)
{
   if (w < p)
   {
      return new Tuple<decimal?, decimal?>(p, null);
   }
   else if(w > p && p>0)
   {
      return new Tuple<decimal?, decimal?>(p, w);
   }
   else
   {
      return new Tuple<decimal?, decimal?>(w, null);
   }
}

答案 3 :(得分:1)

你不能让它返回多个对象。但是,您可以使返回的对象更复杂。

public struct PandW
{
   public decimal? p{get;set;}
   public decimal? w{get;set;}
}

然后更改您的方法以返回PandW对象:

 public static PandW SpecialPrice(decimal w, decimal p)
 {
 PandW temp;
if (w < p)
{
  temp.w=null;
  temp.p=p;
  return temp;
}else if(w > p && p>0){
   temp.w=w;
  temp.p=p;
  return temp;
}else{
   temp.w=w;
   temp.p=null;
   return temp;
}

}

答案 4 :(得分:1)

有多种方法可以返回多个值:

  • 您可以创建具有多个字段的类或结构,并从方法中返回实例
  • 您可以将输出参数添加到方法
  • 您可以返回一个数组
  • 您可以返回KeyValuePair(不推荐)

在这种特殊情况下,我更倾向于第一种方式来返回两个值:

class PriceRet {
    decimal? w;
    decimal? p;
}
PriceRet SpecialPrice(decimal w, decimal p) {
    var res = new PriceRet();
    if (w < p) {
        res.p = p;
    } else if(w > p && p>0) {
        res.w = w;
        res.p = p;
    } else {
        res.w = w;
    }
    return res;
}

答案 5 :(得分:1)

最好的方法是返回具有两个属性的对象,并且还可以使用out变量

public static testhelper SpecialPrice(decimal w,decimal p)
{

//set your values in the object 
var Obj=new testhelper{
w=some value,
p= some value 
};
//// your code 

  if (w < p)
 {
   return p;
 }else if(w > p && p>0){
   //return (w , p);
 }else{
   return w;

}返回Obj; }

public class testhelper{
  public int p{get;set;}
  public int w{get;set;}
 }

答案 6 :(得分:1)

尝试KeyValuePair<decimal,decimal>(w,p),但您需要将返回类型更改为KeyValuePair

希望有所帮助。

答案 7 :(得分:1)

这就是为什么发明的结构

public struct PricePoints
{
    decimal? w, p;

    public PricePoints SpecialPrice()
    {
        PricePoints res;
        if (w < p)
        {
            res.p = p;
            res.w = null;
        }
        else if (w > p && p > 0)
        {
            res = this;
        }
        else
        {
            res.w = w;
            res.p = null;
        }
        return res;
    }
}