2016-06-17 2 views
0

내가C#을 구문 분석 및 비교 거대한 목록/문자열

(2000 각 이상)이 개 거대한 목록이 내가 & 그들을 비교 분석하고자합니다.

목록처럼 보이는 무엇 : 같은

zone "exampledomain.com" { 
zone "exampledomain2.com" { 
zone "exampledomain3.com" { 
zone "exampledomain4.com" { 
zone "exampledomain5.com" { 
zone "exampledomain6.com" { 
zone "exampledomain7.com" { 

가 다른 목록이 보이는 무엇 : 두리스트는 { "____"존이 같은 형식이

zone "exampledomain.com" { 
zone "exampledomain3.com" { 
zone "exampledomain5.com" { 
zone "exampledomain7.com" { 

나는 그래서 구문 분석 할 도메인을 비교 한 다음 도메인의 차이점을 얻을 수 있으므로 다른 하나가 누락되었음을 알고 있으므로 둘 다 동일한 결과를 가져야합니다.

static void Main(string[] args) 
{ 
    string s1 = "i have a car a car"; 
    string s2 = "i have a new car bmw"; 

    List<string> diff; 
    IEnumerable<string> set1 = s1.Split(' ').Distinct(); 
    IEnumerable<string> set2 = s2.Split(' ').Distinct(); 

    if (set2.Count() > set1.Count()) 
    { 
     diff = set2.Except(set1).ToList(); 
    } 
    else 
    { 
     diff = set1.Except(set2).ToList(); 
    } 
} 

하지만 내가 각 목록 2000 이상의 라인을 가지고 생각을 할 수있는 가장 좋은 방법 일 것입니다 무슨 궁금 :

는이 코드를 가로 질러왔다.

답변

0

만 제거 목록 2에서 아이템 목록 1을 보여줍니다주는 예. 당신은 또한 목록 1에없는 목록 2에 무엇을 원하는 경우에 당신은 두 개의 쿼리

var difference1 = list1.Except(list2); 
var difference2 = list2.Except(list1); 

당신이 원하신다면 나는 경우를 제외하고이 실행될 때 관여 무엇 코드 모르겠지만,을해야 할 것 내가 LINQ가 가능한 빨리 그것을 할 수 있는지 모르겠지만, 내 일상의 값이 같은 중복 항목을 처리합니다

static void Differerence(
    IEnumerable<string> source1, IEnumerable<string> source2, 
    out List<string> difference1, out List<string> difference2) 
{ 
    //Move the data from the sources into ordered queues 
    var sourceValues1 = new Queue<string>(source1.OrderBy(x => x)); 
    var sourceValues2 = new Queue<string>(source2.OrderBy(x => x)); 

    difference1 = new List<string>(); 
    difference2 = new List<string>(); 

    while(sourceValues1.Count > 0 && sourceValues2.Count > 0) 
    { 
     string value1 = sourceValues1.Peek(); 
     string value2 = sourceValues2.Peek(); 
     switch (string.Compare(value1, value2)) 
     { 
      //If they match then don't add difference to either list 
      case 0: 
       sourceValues1.Dequeue(); 
       sourceValues2.Dequeue(); 
       break; 

      //The left queue has the lowest value, record that and move on 
      case -1: 
       difference1.Add(value1); 
       sourceValues1.Dequeue(); 
       break; 

      //The right queue has the lowest value, record that and move on 
      case 1: 
       difference2.Add(value2); 
       sourceValues2.Dequeue(); 
       break; 

     } 
    } 
    //At least one of the queues is empty, so everything left in the other queue 
    difference1.AddRange(sourceValues1); 
    difference2.AddRange(sourceValues2); 
} 

: 여기에 차이를 포함하는 두 목록을 생성하는 방법의 구현을 보는 것은 하나 개의 솔루션입니다 다음 예제에서는 "1"이지만 LINQ는 그렇지 않습니다. 속도의 차이가 아니라 사용할 것을 선택할 때 명심하십시오. 당신이

var allDifferences = differenceX1.Union(differenceX2); 
해야하는 경우

static void Main(string[] args) 
{ 
    var list1 = new string[] { "1", "1", "3", "5", "7", "9" }; 
    var list2 = new string[] { "1", "2", "4", "6", "9", "10" }; 

    var difference1 = list1.Except(list2); 
    var difference2 = list2.Except(list1); 

    List<string> differenceX1; 
    List<string> differenceX2; 

    Differerence(list1, list2, out differenceX1, out differenceX2); 
} 

그것은 하나에 두 결과를 결합하는 것은 쉽다