2013-09-01 32 views
1

我有LIST1 <>和LIST2 <>并且想比较这两个列表。以下是我的条件..使用C#排序列表<string>的正确方法是什么?

1-If LIST1 and LIST2 have the same items than add same items to LIST3 
    2-If LIST1 doesnt contain LIST2 items than add different items to LIST4 
    3-if LIST2 doesnt contain LIST1 items than add different items to LIST5 

可以说,我的结果是类似下面要看的条件;

LIST1<string> = A,B,C,D 
LIST2<string> = A,K,F,C 
LIST3<string> = A,C 
LIST4<string> = B,D 
LIST5<string> = K,F 

这里是我的代码;

 foreach (string src in LIST1) 
     { 
      foreach (string trg in LIST2) 
      { 
       if (LIST1.ToString() == LIST2.ToString()) 
       { 
        LIST3.Add(LIST1.ToString()); 
       } 

       else 
       {      
        LIST4.Clear(); 
        foreach (string l3 in LIST1) 
        { 
         if (!LIST2.Contains(l3)) 
          LIST4.Add(l3); 
        } 

        LIST5.Clear(); 
        foreach (string l4 in LIST2) 
        { 
         if (!LIST1.Contains(l4)) 
         { 
          LIST5.Add(l4); 
         } 
        } 

       } 

      } 
     } 
+0

是什么程序需要做的,如果列表1 = 1,2,2,2,3,3 和列表2 = 1,1,1,2,2,4?你是否执行此操作:List3 = 1 2 2/List4 = 2 3 3/List5 = 1 1 4.请参阅[此图片](http://www.siepman.nl/blogimages/exceptall.png)了解我的意思。除了()在这种情况下不起作用。 –

回答

5

一个快速的方法来做到这一点将是:

var list3 = list1.Intersect(list2).ToList(); 
var list4 = list1.Except(list2).ToList(); 
var list5 = list2.Except(list1).ToList(); 

更新:如果你有一个较大的列表(和/或有写这在多个地方),你可以写一个扩展方法像下面这样做:

public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> Diff<T>(
    this IEnumerable<T> first, IEnumerable<T> second) 
{ 
    var intersection = new List<T>(); 
    var onlyInFirst = new HashSet<T>(); 
    var onlyInSecond = new HashSet<T>(second); 

    foreach (var item in first) 
    { 
     if (onlyInSecond.Remove(item)) intersection.Add(item); 
     else onlyInFirst.Add(item); 
    } 

    return Tuple.Create<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> 
     (intersection, onlyInFirst, onlyInSecond); 
} 

这种方法返回表示交集集合的三个IEnumerable<T>的元组,仅在第一个集合中的项目集合以及仅在第二个集合中的项目集合;分别。

用法:

var list1 = new[] { "A", "B", "C", "D" }; 
var list2 = new[] { "A", "K", "F", "C" }; 

var diff = list1.Diff(list2); 
// diff.Item1 = A,C (intersection) 
// diff.Item2 = B,D (only in first) 
// diff.Item3 = K,F (only in second) 
+0

tesekkurler Eren! – user2661591

+0

@ user2661591非常欢迎;)请参阅编辑。 –

0

不知道这与排序做的,但这里的每个条件的Linq语句:

List3 = List1.Intersect(List2).ToList(); 
List4 = List1.Where(l1 => !List2.Any(l2 => l2 == l1)).ToList(); 
List5 = List2.Where(l2 => !List1.Any(l1 => l2 == l1)).ToList(); 

在评论Except指出,将工作太:

List4 = List1.Except(List2).ToList(); 
List5 = List2.Except(List1).ToList(); 
+0

你应该使用'Except'作为最后2条语句 – leppie

相关问题