2014-05-22 4 views
0

동일한 메서드를 사용하여 두 개의 열을 비교하려고합니다. 두 개의 서로 다른 배열에 두 개의 열 저장.C에서 문자열의 두 열을 비교하는 가장 빠른 방법

동일한 작업을 수행하는 빠른 방법이 있으며 두 열이 커질 수 있으므로 효율적인 방법이 필요합니다.

일부 테이블에서 두 개의 열 값을 가져와야합니다. 배열은 값을 유지하거나 다른 구조가 사용해야하는 좋은 아이디어입니다.

감사합니다, Except LINQ 확장 방법을 사용하여

+1

당신이'HashSet의 '에서이 값을 저장할 수있는 열의 반복 값이없는 경우입니다; 반복 가능한 값이있는 경우 - 사전. Hashbased 컬렉션은 문제의 배열/목록보다 효율적입니다. –

+0

@ Dmitry Bychenko - 두 열의 값은 반복 가능한 값을가집니다. – manu

+0

데이터베이스가 있습니다. 쿼리에서 비교 만 할 수는 없습니까? –

답변

1

을 속도가 데이터 그러나

// Key (string) - String value 
// Value (int) - repeat count 
Dictionary<String, int> values = new Dictionary<String, int>(); 

// Fill values: adding up v1, removing v2 
using (IDataReader reader = myQuery.ExecuteReader()) { 
    while (reader.Read()) { 
    //TODO: put here the right reader index 
    String v1 = reader[1].ReadString(); 
    String v2 = reader[2].ReadString(); 

    int repeatCount; 

    if (values.TryGetValue(v1, out repeatCount)) 
     values[v1] = repeatCount + 1; 
    else 
     values[v1] = 1; 

    if (values.TryGetValue(v2, out repeatCount)) 
     values[v2] = repeatCount - 1; 
    else 
     values[v2] = -1; 
    } 
} 

// Select out the keys with positive values (where repeat count > 0) 
List<String> result = values 
    .Where(pair => pair.Value > 0) 
    .Select(pair => pair.Key) 
    .ToList(); 

을 가져올 때 대신 Lists/ArraysDictionary를 사용할 수있는 모든 우려가있는 경우 , Linq 용액

List<String> result = List1.Except(List2).ToList(); 

훨씬 더 consize

3

,

List<string> resultList = SecondList.Except(FirstList).ToList(); 
+0

이 가장 빠른 방법입니다. 목록의 크기가 약 1000 개 이상으로 증가하더라도? – manu

+1

1000은 크지 않습니다. 그들이 다른지 확인하고 싶습니까? 그렇다면 IEnumerable + count를 사용하여 반복을 저장하십시오.하지만 1000 값이 실질적으로 아무 것도 없으므로 큰 영향을 미치지 않을 것이라고 생각합니다. –

2

당신은 두 개의 목록을 비교하기위한 Except 기능을 사용할 수 있습니다. 이런 식으로 뭔가 :

List<string> result = list1.Except(list2).ToList(); 
1

이 시도 :

List<string> resultList = SecondList.Except(FirstList).ToList(); 
1
var arr1 = new string [] { "b1", "b3"}; 
var arr2 = new string [] { "b1", "b2"}; 

arr1.SequenceEqual(arr2);