2013-06-20 94 views
2

我希望能夠比較兩個列表並查看這些值是否具有相同的順序。將兩個列表與訂單更改進行比較

例如,如果我有一個字段的表和喜歡的順序:

Field -- Order 

F1 -- 1 

F2 -- 2 

F3 -- 3 

F4 -- 4 

和另:

Field -- Order 

F1 -- 3 

F2 -- 2 

F3 -- 1 

F4 -- 4 

我希望能夠返回的所有行的列表,並附有改變順序,在這種情況下,它將是F1和F3。

我認爲這樣做的一種方式是比較訂單字段的前一個值和下一個值,因此如果兩者都不同,則順序會發生變化。我還必須考慮任何增加或刪除的值。

ETA: 我想澄清我的意思是考慮到可能的添加或刪除。

說第二個表,現在看起來像:

Field -- Order 

F1 -- 1 

F3 -- 3 

F4 -- 4 

因爲事情已被刪除。訂單價值沒有改變,但F3現在在F1之後。 F4也一樣。

所以我想我的結果顯示F3和F4已經改變。

+1

「F1,F2,F3,F4 ...... FN」是否總是按照正確的順序排列? –

+0

@ChrisSinclair沒有一個正確的順序。將它想象爲一個值,它指示接下來要執行哪個字段。 –

+0

對於編輯後的例子,我們可以考慮*只是* 3或*只是* 1亂序? – Dukeling

回答

0

我感覺這是一個功課問題:P所以我會給你一個半碼的答案;)。

編輯:實際上它並不重要,我:P

List<int> checkList = new List<int>(); 

for (var i = 0; i < list1.Count; i++) 
{ 
    if (list1[index] != list2[index]) 
    { 
     checkList.Add(list1[index]); 
    } 
} 
// checkList will be your answer. 

EDIT2:這個是什麼?

List<int> checkList = new List<int>(); 
int[] firstList = new int[list1.Count]; 
int[] scndList = new int[list2.Count]; 
// Structure data 
for (var i = 0; i < firstList.Length; i++) 
{ 
    firstList[list1.Fvalue] = list1.intValue; 
    scndList[list2.Fvalue] = list2.intValue; 
    // Fvalue is that f, you can use substring and int parsing for that. 
} 

for (var i = 0; i < list1.Count; i++) 
{ 
    if (firstList[index] != scndList[index]) 
    { 
     checkList.Add(firstList[index]); 
    } 
} 
// checkList will be your answer. 
+0

如果我不必考慮添加/刪除的項目,這將工作。由於兩個值可能有不同的索引,但由於某個項目已被刪除,所以它仍然處於相同的順序。因此,我爲什麼首先想到驗證前一個值和下一個值。 :S –

+0

我編輯了這個問題,以澄清我的意思是增加或刪除價值。謝謝你的幫助,但我不認爲只是檢查索引將工作 –

1

這將檢查平等2所列出

bool AreSame = list1.SequenceEqual(list2); 

這是對它們進行排序,而不必重複成員之間:

var union = (from s in list1 select s).Union(from s1 in list2 select s1).OrderBy(x => x); 
//this is based if its list of strings for example 
//this next you select some property 
var union = (from s in list1 select s.SomeProperty).Union(from s1 in list2 select s1.SomeProperty).OrderBy(x => x); 

這下會返回布爾值的enemerable其中true表示不同的項目:如果結果爲真,假,假,真意味着在兩個列表之間第一個和第四個元素是不同的。

var some = list1.Zip(list2, (a, b) => a.SomeProperty != b.SomeProperty); 
+0

對於'Zip' ...'list1.Zip(list2,(a,b)=> new {a,b})。 => xaOrder!= xbOrder).Select(x => xaField)'會做。 – nawfal