2012-04-11 51 views
2

這很可能非常簡單,但我似乎無法弄清楚:)代碼合同C#確保價值是在陣列

我有2個int數組。 我想確保一個值在兩個數組中使用某種形式的代碼契約。 如果該值不是兩個陣列,我不想繼續

可以這樣做嗎? 我在想這樣的事情,但似乎無法得到它的工作

Contract.Requires(g[variable ] == y[variable]) 

值必須是在同一個毒藥在兩個數組

這是我現在有

private static int FirstCut(int[] g, int[] h) 
     { 
      int x = 0; 

      Contract.Requires(g.Length > 0);    
      Contract.Requires(g.Length == h.Length); //skal være lige lange 

      while (g[x] != h[x]) 
      { 
       x++; 
      } 
      return x; 
     } 

問候

+1

你說「兩個數組」,但你只有一個數組 - 「g」。 – Donut 2012-04-11 17:58:01

+0

只是爲了澄清。我不知道如何輸入變量。 我很確定它可以像這樣在java 中確保g [\ result] == h [\ result]; – Birger 2012-04-11 18:20:04

回答

1
Contract.Requires(g[variable ] == g[variable]) 

那麼這只是一個數組,即使它是兩個,也需要它們在同一個索引處找到,你沒有說是一個需求。在我看來,就好像條件應該是:

x.Contains(variable) && y.Contains(variable) 

假設xy是類型int[]的。

此外,我對C#中的代碼合同或者在方法頂部執行兩個O(n)操作的性能影響一無所知。

+0

我的錯誤..複製/粘貼錯誤 變量應該是什麼?該值應該位於兩個數組中的相同索引中。 – Birger 2012-04-11 18:00:36

+1

代碼合同確保通話靜態分析;它們不會在運行時執行。 – phoog 2012-04-11 19:20:27

+0

@phoog:有趣。那怎麼可能考慮到這些數組的內容在編譯時不可能被知道?那麼這個表達式不可能被評估。我意識到這些可能在發佈版本中被禁用。 – 2012-04-11 19:22:09

0

如果該值應該是相同的索引,假設兩個gyint[]variableint,那不是一樣的東西:

Contract.Requires(g.Contains(variable) && g.IndexOf(variable) == y.IndexOf(variable)) 

免責聲明:完全未經測試,也許我米不理解的問題

+0

對於每個不存在的項目,經歷兩次'g'和'y'一次。你可以做得更好,表現明智。您可以只存儲一個'indexOf'調用的結果,並檢查另一個數組中該索引的值。同一個變量和同一個數組上的'Contains'和'indexOf'也是多餘的。 – Servy 2012-04-11 18:14:54

+1

嗯,是的,但是這是針對代碼合同,它並不真正需要執行(因爲生產代碼通常會「禁用」檢查),另外,我們鼓勵編寫簡短,可讀的(不一定是高性能的)代碼合同的表達。 – Jcl 2012-04-11 18:18:46

+0

這只是多餘的。這不像是在增加複雜性,而是爲了提高性能而刪除它。這是雙贏的。 – Servy 2012-04-11 18:19:43

0
for(int i = 0; i < firstArray.Length && i < secondArray.Length; i++) 
{ 
    if(firstArray[i] == mySearchValue && secondArray[i] == mySearchValue) 
    { 
    //whatever you want to do 

    break; //you can remove this if you don't want to stop the loop. 
    } 
} 
+0

確定它可以做到這一點..但是正在尋找一些方法來做代碼合同 – Birger 2012-04-11 18:18:05

+0

@Birger你可以在循環中設置一個布爾型「isFound」,並使用Code Contract檢查結果。 – Servy 2012-04-11 18:29:06

+0

我剛剛在第一篇文章中添加了som基本代碼。 循環將永遠不會停止,除非我確定同一個點上的兩個數組中的值相同 – Birger 2012-04-11 18:37:18

0

在我大四那年在擺弄代碼契約公平一點,這是何等的ID合作解決你的問題。它看起來比一些發佈的解決方案更清潔。

public static int FirstCut(int[] g, int[] h) 
{ 
    Contract.Requires(h.Length == g.Length); 
    Contract.Requires(Contract.Exists(0, g.Length, x => g[x] == h[x])); 

    //Do whatever knowing that 2 values at index x in the arrays are the same 
}