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

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

public static decimal? SpecialPrice(decimal w, decimal p) { if (w 

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

我想在w> p和p> 0时返回两个变量(w和p),但我不知道怎么能像那样返回。 有人知道吗?

你可以使用一个Tuple

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

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

  1. 没有参考
  2. Ref params
  3. 返回包含多个值的结构/对象,或者像集合一样的其他类型

基本上,#1和#2允许您使用方法参数,将值传递回调用代码。 请参阅此处以获取示例和参考:

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

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

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

对我来说,代码的意图并不是很清楚,因此您需要确定哪种方法最适合您。

在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类,它允许您按名称引用其每个值。

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

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

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

}

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

  • 您可以使用多个字段创建类或结构,并从方法返回实例
  • 您可以向方法添加输出参数
  • 您可以返回一个数组
  • 您可以返回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; } 

最好的方法是返回具有两个属性的对象,并且还可以使用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;} } 

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

希望有所帮助。

这就是发明结构的原因

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