2013-06-20 61 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