2011-12-20 18 views
2

我創建了c#的函數來比較我的項目中的價格。如何在c#方法中返回2值

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),但我不知道該如何返回。任何人都知道嗎?

+4

結構請選擇一個風格的大括號,並使它保持一致。 – 2011-12-20 03:31:27

+2

[函數返回兩個值可能嗎?]的可能重複(http://stackoverflow.com/questions/2434222/is-it-possible-for-a-function-to-return-two-values) – 2011-12-20 03:43:32

+0

這個邏輯混淆的是,如果'w'和'p'被視爲輸入和輸出參數。 – ja72 2012-03-15 13:07:38

回答

5

你可以使用一個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); 
    } 
} 
+0

'Tuple.Create(p,(decimal?)null);'會(稍微)不那麼麻煩。 – 2011-12-20 03:48:34

+0

@plmw:我試過了,但結果是包含(,),如何顯示結果避免這種格式? – Nothing 2011-12-20 05:53:15

+0

@socheata你想使用.ToString()來顯示價格嗎?如果是這樣,你應該使用tuple.Item1.ToString()來挑選第一個值。當你同時返回w和p時,你想顯示什麼? – plmw 2011-12-20 07:24:58

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

如果知道哪個值是這種方法執行後,你可以使用更復雜的集合類像字典類,它可以讓你指的是它的每一個值是非常重要的按名字。

我不會在這種情況下創建一個新的結構體或類,因爲我認爲數組大小是一個非常簡單的指示,表示返回多少個值,其中類和結構體在調用此方法之前將具有相同數量的變量之後,使得難以分辨返回多少個值。

+0

使用集合初始化程序時,指定數組大小是多餘的(除非您意外指定錯誤數量的項目時要獲得編譯錯誤)。 – 2011-12-20 03:39:40

+0

@mootinator,你可能是對的。我剛寫了這個沒有測試。我會糾正它。 – Roman 2011-12-20 03:42:38

+2

@socheata:你真的不需要在每個人的回答中留下「+1謝謝你的回答」評論。只需點擊+1按鈕;他們可以說他們的答案已經被提升。假設這意味着「謝謝,這個答案很有用」。在整個地方添加這樣的評論只會讓事情變得混亂。 – 2011-12-20 04:49:39

7

您返回多個值調用代碼的選擇是:

  1. OUT參數,
  2. 參考PARAMS
  3. 返回結構/對象,它包含多個值,或其他類型喜歡收藏

基本上,#1和#2讓你有方法參數,可以將值傳遞迴調用代碼。在這裏看到的例子&參考:

http://msdn.microsoft.com/en-us/library/ee332485.aspx(OUT參數,)

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

對於#3,你會使用來自不同decimal?返回值。例如,您可以聲明具有兩個屬性的類並返回該類的一個實例。或者返回一個List<decimal>或其他可以保存多個值的類型。

這不是真的我清楚你的代碼的意圖是什麼,所以你需要決定哪種方法最適合你。

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

}

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

最好的辦法是返回一個具有兩個屬性的對象,也可以使用了可變

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

嘗試KeyValuePair<decimal,decimal>(w,p),但你需要你的返回類型更改爲KeyValuePair

希望有所幫助。

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