2014-03-05 4 views
1

enter image description here데이터 집합에서 중복 행을 확인하는 방법은 무엇입니까?

중복 행이있을 때 실행할 내 오류 메시지를 원하는 중복 행이있는 데이터 집합이 있습니다.

다음은 당신이 당신에게 논리를 조금 변경하는 생각

DataSet dsXml = new DataSet(); 

dsXml.ReadXml(new XmlTextReader(new StringReader(xml))); 
Hashtable hTable = new Hashtable(); 
ArrayList duplicateList = new ArrayList(); 
foreach (DataRow drow in dsXml.Tables[0].Rows) 
{ 
    if (hTable.Contains(drow)) 
    { 
     duplicateList.Add(drow); 
    } 
    else 
    { 
     script.Append("alert('Error - There are some Duplicate entries.'); "); 
     ErrorOcc = true; 
     if (ErrorOcc) 
     { 
      this.ScriptOutput = script + " ValidateBeforeSaving = false;"; 
      this.StayContent = "yes"; 
      return; 
     } 
    } 
} 
+0

도움이 더 필요하십니까? 그렇지 않은 경우 대답으로 표시하여이 질문을 닫으십시오. –

답변

0

도와주세요 내 코드입니다. hTable에 행을 추가하지 않으므로 중복되지 않습니다. 그리고 마지막에 메시지를 보여줘야한다고 생각합니다. 그렇지 않으면 목록이 아직 완성되지 않았습니다.

다른 사람들이 언급했듯이 비교가 작동하려면 Sergeys 응답이 필요합니다. 이 코드를 다룬다면이 코드는 다른 논리 문제를 해결할 것입니다.

+0

이것은 기본 'DataRow' 동등 비교 인 – Simon

+0

을 사용합니다. @ Simon : 사실입니다. Sergey에 대한 훌륭한 답을 보았습니다. 그럼에도 불구하고 코드는 구현 된 경우에도 좋지 않습니다. OP에서 두 답변을 하나로 합칠 것을 제안합니다. –

+1

올바른 그는 다른 문제가 있습니다 :) – Simon

0

먼저 행 사이의 비교를 정의해야합니다. hTable을 만들면 아무것도 나타나지 않으므로 hTable.Contains 호출은 항상 false를 반환합니다. 보조 노트로

, 당신은 단지 다른 DataRowDataRow을 비교할 수 없습니다, 그것은 (IEqualityComparer를 사용하여 구현) 기본 같음 비교를 사용하여 효과적으로 행 아무도 없을 것입니다 참조 평등 검사로 귀결됩니다 서로 동일하다.

어딘가에 직접 IEqualityCompariosn을 구현하거나 각 행의 값을 확인하는 맞춤 메소드를 작성할 수 있습니다.

3

DataRow 인스턴스가 필드를 비교하는 대신 참조로 비교되므로 코드가 작동하지 않습니다. 당신은 사용자 정의 비교자를 사용할 수 있습니다

public class CustomDataRowComparer : IEqualityComparer<DataRow> 
{ 
    public bool Equals(DataRow x, DataRow y) 
    { 
     if (x.ItemArray.Length != y.ItemArray.Length) 
      return false; 

     for (int i = 0; i < x.ItemArray.Length; i++)        
      if (!x[i].Equals(y[i])) 
       return false;    

     return true; 
    } 

    public int GetHashCode(DataRow obj) 
    { 
     int hash = 17; 
     foreach (object field in obj.ItemArray) 
      hash = hash * 19 + field.GetHashCode(); 

     return hash; 
    } 
} 

또는 값 기반 비교를 사용하여 동등성에 대한 DataRow 개체를 비교 DataRowComparer 기존 사용

HashSet<DataRow> set = new HashSet<DataRow>(DataRowComparer.Default); 
// or: new HashSet<DataRow>(new CustomDataRowComparer()); 

foreach (DataRow row in dsXml.Tables[0].Rows) 
{ 
    if (!set.Add(row)) 
     // duplicate row 
} 

중복 행이 데이터 집합 쿼리 Linq에 함께 존재하는 경우도 확인하실 수 있습니다 :

var duplicatedRowsExist = dsXml.Tables[0].AsEnumerable() 
           .GroupBy(r => r, DataRowComparer.Default) 
           .Any(g => g.Count() > 1); 
1

행 자체는 아니고 행의 내용을 비교해야합니다. ..

다음
var hasDupes = dsXml.Tables[0].Rows 
    .AsEnumerable() 
    .GroupBy(row => new 
    { 
      row.Field<string>("Title"), 
      row.Field<string>("Address"), 
      row.Field<string>("State"), 
      row.Field<string>("City"), 
      row.Field<int>("Status"), 
      row.Field<int>("CreatedBy"), 
      row.Field<int>("UpdatedBy") 
    }) 
    .Where(g => g.Count() > 1) 
    .Any(); 

if(hasDupes) 
    //Show error message 
0

당신은 데이터 세트에서 중복 행을 확인 할 수 있습니다 내 위의 질문

의 대답은 그것을 시도 잘 작동이 같은 뭔가를해야한다.

   DataSet dsXml = new DataSet(); 
       dsXml.ReadXml(new XmlTextReader(new StringReader(xml))); 

       List<string> duplicateList = new List<string>(); 
       foreach (DataRow drow in dsXml.Tables[0].Rows) 
       { 
        string strr = ""; 

        for (int j = 0; j < dsXml.Tables[0].Columns.Count; j++) 
        { 
         strr += drow[j]; 
        } 

        if (!duplicateList.Contains(strr)) 
        { 
         duplicateList.Add(strr); 
        } 
        else 
        { 
         script.Append("alert('Error - There are some Duplicate entries.'); "); 
         ErrorOcc = true; 
         if (ErrorOcc) 
         { 
          this.ScriptOutput = script + " ValidateBeforeSaving = false;"; 
          this.StayContent = "yes"; 
          return; 
         } 
        } 
       } 
관련 문제