如何在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); } }
您将多个值返回到调用代码的选择是:
- 没有参考
- Ref params
- 返回包含多个值的结构/对象,或者像集合一样的其他类型
基本上,#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
但您需要将返回类型更改为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; } }