2012-11-15 65 views
0

我有2個數組(每個數組都包含2個字符串),其中一個包含來自USB的序列號。另一個包含來自文本文件的序列號。我能夠成功地檢索它們。所以這裏是我的問題:我需要將它們相互比較,找到一個不同的序列號,並將其替換。像這樣:找到相同的數字並用新的替換其他數字

Contents (Dummy Serial numbers) 
    ________ 
USB | A | B 

TXT | B | C 

正如你所看到的,USB和TXT陣列都包含一個相同的序列號(B)。這部分很容易;不過,我需要編寫代碼來查看C = A,然後我需要更換C.

我嘗試這樣做:

for (int x = 0; x < 2; x++) 
{ 
    for (int y = 0; y < 2; y++) 
    { 
      //checks for same serial number 
      if (m_AttachedUSB[x] == m_Existing_Serial_Numbers[y]) 
      { 
       //found one 
       IntOnlyOne++; 
       //we want this one to stay beacause it has a serial number 
       //that matches one in the .txt file 
       m_ChachedUSB = m_AttachedUSB[x]; 
      } 
    } 
} 

但是,這僅發現類似的序列號。我如何替換那些不同的?

+2

怎麼樣和5個號碼一個例子,我仍然無法理解的問題 – CloudyMarble

+0

它會爲一個明智的做法是修改的最大長度,你的循環來動態長度即x ThaMe90

+0

我確切地想要2 – MrBretten

回答

0

隨着你的清單隻有4個項目你可以把它簡單:

if(usbArray[0] == textArray[0]) 
    usbArray[1] = textArray[1]; 
else if(usbArray[0] == textArray[1]) 
    usbArray[1] = textArray[0]; 
else if(usbArray[1] == textArray[0]) 
    usbArray[0] = textArray[1]; 
else if(usbArray[1] == textArray[1]) 
    usbArray[0] = textArray[0]; 

基本上,改變兩個是不同的。

而第二個方案:

for(int i=0; i<=1; i++) 
    for(int j=0; j<=1; j++) 
    if(usbArray[i] == textArray[j]) 
     usbArray[(i+1)%2] = textArray[(j+1)%2]; 
+0

這個工作很好,有什麼辦法縮短它嗎? – MrBretten

+0

是的,你可以留下最後一個「else if」和「else」的情況。我添加了第二個解決方案:) – Carra

+0

非常感謝! – MrBretten

0

如果我理解你的權利:

List<int> usb = new List<int> {1,2,4,7,8}; 
List<int> text = new List<int> {1,2,3,4,5}; 

usb.Intersect(text).Union(usb); 

這將返回一個包含{1,2,4,7,8}的列表。

相交方法爲您提供了由兩個列表中包含的所有項目。在這種情況下{1,2,4}。 聯合方法將在USB尚未提供時加入USB中的所有項目。在這種情況下{7,8}。

+0

'(A相交B)聯合A'只是'A',模數重複。 – Rawling

+0

這將工作的字符串? – MrBretten

+0

這將適用於所有類型,但正如@Rawling所說,這與使用usb列表相同。這意味着它不會保留排序順序。 – dwonisch

0

下面創建一個集的USB列表中的所有序列號,然後通過TXT列表循環,無論是從USB設置刪除匹配項或注意到的TXT列表中的「舊」項目的索引。

然後它與USB集的其餘項目,這應該是現在只是「新」項目取代了「老」的項目。

這是假定這兩個列表的長度相同,且USB列表中沒有重複。

HashSet<string> usbSNs = new HashSet<string>(m_AttachedUSB); // { "A", "B" } 
List<int> txtOldIndices = new List<int>();     // { } 

// Remove existing items from USB set, note indices of old items in TXT list. 
for (int i = 0; i < m_CachedUSB.Length; i++) 
{           // First iteration Second iteration 
    if (!usbSNs.Remove(m_CachedUSB[i])) // Now { "A" }  Still { "A" } 
     txtOldIndices.Add(i);    // Still {}   Now { 1 } 
} 
// At this point you may want to check usbSNs and txtOldIndices 
// have the same number of elements. 

// Overwrite old items in TXT list with remaining, new items in USB set.  
foreach(var newSN in usbSNs) 
{ 
    m_CachedUSB[txtOldIndices[0]] = newSN; // Now [ "B", "A" ] 
    txtOldIndices.RemoveAt(0);    // Now { } 
} 

從本質上講,這是複製m_AttachedUSBm_CachedUSB的一種方式,同時保留這是共同的,這就是我假設你要爲項目的位置。

+0

哈希集的目的是什麼?我可以用一個列表來代替嗎?此外,這些序列號使用字母和數字。 txtOldIndicies應該是一個字符串而不是int嗎? – MrBretten

+0

HashSet允許一個快速的this-this-set-contain檢查 - 如果你處理的是多個元素,這將會很重要。 'List '是一個索引列表,因此'int'而不是'string'是正確的。 – Rawling

相關問題