如何在c#中返回2个值

本文关键字:返回 2个值 | 更新日期: 2023-09-27 18:18:15

我创建了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> p和p> 0时,我想返回两个变量(w和p),但我不知道如何返回。有人知道吗?

如何在c#中返回2个值

您可以选择向调用代码返回多个值:

  1. 出params
  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?的返回值。例如,您可以声明一个具有两个属性的类,并返回该类的一个实例。或者返回一个List<decimal>或者其他可以保存多个值的类型

我不太清楚你的代码的目的是什么,所以你需要决定哪种方法最适合你。

您可以使用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);
   }
}

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

尝试KeyValuePair<decimal,decimal>(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;
    }
}

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