2014-10-16 1 views
0

Excel 시트 &에서 데이터를 읽는 코드가 있습니다.모든 값이 초기화 된 객체 내에서 null인지 확인

이제 사용자가 유효한 데이터를 복사 한 다음 많은 행을 비워 두어 다시 & 유효한 데이터를 복사하는 시나리오가 있습니다. 빈 행이 많이 읽 힙니다. 전 엑셀에 대한 오래된 코드를 사용하고 있습니다. 어딘가에서 사용될 수도있는 &을 읽으므로 그걸로 엉망이되고 싶지는 않습니다.

문제는 List 내에서 초기화되는 개체가 많지만 모든 값이 null입니다. 나는이 엑셀 시트 & 따라서 전체 열 목록 코드는 하나의 다시 다시 &을 변경할 필요가 변경 될 수 있기 때문에 최선의 또는 유지 관리 방법을 시들게하지 알고

if (lstConsolidatedData != null) 
{ 
    foreach (var lst in lstConsolidatedData) 
    { 
     if(lst.a!=null && lst.b!=null && lst.c!=null //& so on....) 
     { 
      //some stuff... 
     } 
    } 
} 

: 그래서 내가 좋아하는 경우에 모든 attribuets을 확인 결국 열을 추가하거나 Excel에서 제거했습니다.

lst 내의 모든 값을 단일 명령문에서 검사 할 수있는 방법이 있습니까? 어떤 것 lst.all !=null

어떤 코드가 아니라면 어떤 생각이 나에게 도움이 될 것입니다. 실제로 삭제하고 싶은 어떤 널 에 대한 o.GetType().GetProperties().Any(c => c.GetValue(o) == null) 작동하지만 :이 오류를

enter image description here

편집을 얻고 이하에서 사용하여 답변 :

lst==nullfalse

편집을주의하시기 바랍니다 모든 열에 데이터가없는 행은 특정 하나 또는 두 개의 열이 아닙니다. 이름/열 수가 자주 변경되기 때문에 문제가 o.Item1 != null && ...에 의해 해결되지 않습니다.

+0

'lstConsolidatedData'의 유형은 무엇입니까? – Alireza

+1

'a','b' 등은 무엇입니까? 그들은 클래스 또는 필드의 속성입니까? –

+0

@Alireza, lstConsolidatedData는 List 입니다. ConsolidatedData는 사용자 지정 데이터 형식 또는 클래스입니다. –

답변

0

는 내가 코드를 사용하여 빈 행을 삭제 목록으로 데이터 집합을 켜기 전에 예전의 코드 & 아래로 파고 결국 :

 //Deleting empty records from Datset 
     foreach (DataTable source in result.Tables) 
     { 
      for (int i = 0; i < source.Rows.Count; i++) 
      { 
       DataRow currentRow = source.Rows[i]; 
       bool isEmpty = false; 
       foreach (var colValue in currentRow.ItemArray) 
       { 
        if (!string.IsNullOrEmpty(colValue.ToString())) 
        { 
         isEmpty = false; 
         break; 
        } 
        else 
         isEmpty = true; 

       } 
       if (isEmpty) 
        source.Rows[i].Delete(); 
      } 
     } 
     result.AcceptChanges(); 

실제로있는 어떤 기록없이 데이터 세트에 수행 된 변경 사항을 저장하기 때문에 .AcceptChanges() 잊지 마세요 제거됩니다.

2

리플렉션을 사용하면이 작업을 수행 할 수 있지만 명시 적으로 수행하는 것보다 성능 손실이 발생합니다. 이

public bool IsAnyPropertyNull(object o) 
{ 
    return o.GetType().GetProperties().Any(c => c.GetValue(o) == null); 
} 

그러나, 기본 제공하지-에 표현식 o.Item1 != null && o.Item2 != null && ... 유형 구문을 줄일 수 있습니다.

또한 내가 말하는 값은 속성이라고 가정합니다. 더 적절한 경우 GetFields 또는 필요한 것을 사용할 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 예, 여기서는 속성에 대해 이야기하고 있습니다. 그것이 나를 위해 작동하는지 확인합시다. –

+0

오류, 수정 된 질문입니다. –

+0

@PranavSingh 사용중인 C# 버전은 무엇입니까? 나는 당신의 오류를 기이하게 재현 할 수 없다. 오버로드 된'c.GetValue (o, null)'을 시도 할 수는 있지만 그 중 하나가 작동하는지 확신 할 수 없다. –

0

ConsolidatedData에 대한 확장 방법을 다음과 같이 작성할 수 있습니다.

public static bool IsAnyPropNull(this ConsolidatedData cdata) 
{ 
    return cdata.GetType().GetProperties().Any(p => p.GetValue(this) == null); 
} 

그런 다음 한 줄로 목록을 필터링 할 수 있습니다.

var filteredList = lstConsolidatedData.Where(cd => !cd.IsAnyPropNull()).ToList(); 

null이없는 모든 개체의 목록을 반환합니다. 널 (null)을 원하면 !을 제거하십시오.

편집;

와우, 내 대답은 Matthew Haugen의 답변과 거의 같습니다.구현이 약간 다르더라도 둘 다 잘 작동합니다.

1

Mathew Huagen이 리플렉션을 사용하여 속성을 얻은 다음 해당 값을 확인하면 문제가없는 것으로 지적했습니다. 그러나 검사를 원하지 않는 속성이있을 수 있다는 큰 경고가 있습니다. 이 문제를 해결하려면 (팀 Schmelter가 언급 한 바와 같이) 당신은 목록 안에 넣어 수 있습니다, 또는 당신이 그들을 구별하기 위해 사용자 정의 속성 ConsolidatedData의 원하는 속성을 장식 할 수 있습니다 그럼 널 (null)에 대해 확인

public class ConsolidatedData 
{ 
    public int Id { get; set; } 
    [NotNull] 
    public object PropertyOne { get; set; } 

    [NotNull] 
    public object PropertyTwo { get; set; } 
} 

public class NotNull : Attribute { } 

이 안전 할 때를 하지 NotNull 속성을 갖는 속성을 필터링 :

ConsolidatedData v = new ConsolidatedData(); 
bool allNotNull = v.GetType().GetProperties() 
        .Where(p => null != (Attribute.GetCustomAttribute(p, typeof(NotNull)) as NotNull)) 
        .All(p=>p.GetValue(v) !=null); 

는 여기에 부동산 Id

체크되지 않습니다.

+0

이것은 유용 할 수 있지만 제약 조건은 속성이 nullable이 될 수 있다는 표시입니다. 그들 'NotNull'은별로 의미가 없습니다. 어쨌든 당신의 도움에 감사드립니다. –

관련 문제