2012-11-11 58 views
0

我想將Python程序轉換爲C#。我不明白這裏做了什麼。Python排序()函數並返回多個值

def mincost(alg): 
    parts = alg.split(' ') 
    return sorted([cost(0, parts, 'G0 '),cost(1, parts, 'G1 ')], key=operator.itemgetter(1))[0] 

def cost(grip, alg, p = '', c = 0.0, rh = True): 
    if (len(alg) == 0): 
     return (postProcess(p),c) 

postprocess返回字符串

上排序()函數中使用

cost返回多個參數? sorted()函數如何使用這些多個值?

key=operator.itemgetter(1)是做什麼用的?這是排序的基礎,所以在這種情況下,多值返回cost,它會使用值c

有沒有辦法在C#中做到這一點?

+1

參見[排序的Mini-HOW TO(http://wiki.python.org/moin/ HowTo/Sorting /) – Abhijit

+0

@Abhijit,是的,謝謝。我應該RTFM –

+2

我不確定我想要完全複製該代碼。但基本上,itemgetter會從列表中獲得第二個(第1項),這裏用作排序關鍵字。所以它會從列表中排序第二項。 – Keith

回答

0

使用sorted有一點奇怪。你可以很容易地用一個簡單的if語句代替它。即使更奇怪,cost只返回c作爲返回元組的第二個值。在mincost,cost永遠不會被調用的值不是默認值c,所以c總是0.0使排序相當多餘。但我猜想有一些關於成本函數的缺失部分。

不過,你可以實現它的功能是這樣的:

string MinCost (string alg) { 
    List<string> parts = alg.split(" "); 
    Tuple<string, double> cost1 = Cost(0, parts, "G0 "); 
    Tuple<string, double> cost2 = Cost(1, parts, "G1 "); 

    if (cost1[1] < cost2[1]) 
     return cost1[0]; 
    else 
     return cost2[0]; 
} 

Tuple<string, double> Cost (int grip, List<string> alg, string p="", double c=0.0, bool rh=True) { 
    if (alg.Count == 0) 
     return new Tuple<string, double>(PostProcess(p), c); 

    // ... there should be more here 
} 

(未經測試)

+0

感謝@poke,的確我刪除了部分代碼。對於「排序」,有更多的調用「成本」,並且在「成本」下面有更多的代碼。 –

+0

嗯,這樣做更有意義:) – poke