2017-11-08 3 views
0

클래스 목록이 있는데이 클래스에는 두 개의 열이 있습니다. 이제 특정 열을 사용하여 해당 클래스에서 중복 행을 제거하고 싶습니다. 첫 번째 열에서만 복제본을 제거하는 것과 마찬가지로, 전송 열에서만 제거하거나 둘 다에서 제거하십시오. 이렇게하려면 다음 코드를 사용하고 있습니다. 앞으로이 클래스에서 20-25 개의 열을 가질 것이므로이 함수에서 20-25 if 문을 추가해야하기 때문에이 프로세스를 수행하는 가장 좋은 방법이 있습니까?선택한 열을 기반으로 목록에서 중복 행을 제거 하시겠습니까?

public List<ContactTemp> RemoveDupliacacse(List<ContactTemp> ContactTempList, List<string> objcolumn) 
{ 
    List<ContactTemp> ContactTempListRemobdup = new List<ContactTemp>(); 
    if (objcolumn.Contains("CITY")) 
    { 
     ContactTempListRemobdup = ContactTempList.GroupBy(s => s.City).Select(group => group.First()).ToList(); 
    } 
    if (objcolumn.Contains("STATE")) 
    { 
     ContactTempListRemobdup = ContactTempList.GroupBy(s => s.State).Select(group => group.First()).ToList(); 
    } 
    return ContactTempListRemobdup; 
} 

답변

0

어때?

public static List<ContactTemp> RemoveDupliacacse(
    List<ContactTemp> ContactTempList, 
    IEnumerable<Func<ContactTemp, object>> columnSelectors) 
{ 
    IEnumerable<ContactTemp> ContactTempListRemobdup = ContactTempList; 

    foreach(var selector in columnSelectors) 
    { 
     ContactTempListRemobdup = ContactTempListRemobdup 
      .GroupBy(s => selector(s)) 
      .Select(group => group.First()); 
    } 

    return ContactTempListRemobdup.ToList(); 
} 

다음과 같이 사용할 수 있습니다. 여러 열을 선택하면


이미 아시다시피

RemoveDupliacacse(list, new List<Func<ContactTemp, object>> { 
    (ContactTemp contact) => contact.State, (ContactTemp contact) => contact.City }) 

는 방법은 각 열에 대해 중복을 제거합니다. 다음 예제를 확인하시기 바랍니다 :

 var list = new List<ContactTemp> { 
      new ContactTemp { City = "1", State = "1" }, 
      new ContactTemp { City = "1", State = "2" }, 
      new ContactTemp { City = "2", State = "1" }, 
      new ContactTemp { City = "2", State = "2" } 
     }; 

     foreach (var contact in RemoveDupliacacse(
      list, 
      new List<Func<ContactTemp, object>> { 
       (ContactTemp contact) => contact.State, 
       (ContactTemp contact) => contact.City })) 
     { 
      Console.WriteLine($"City:{contact.City}, State:{contact.State}"); 
     } 
     // This will output: 
     // City: 1, State: 1 

     // If you want to check duplication of the combination of the selected columns, 
     // you can do it like this; 
     foreach (var contact in RemoveDupliacacse(
      list, 
      new List<Func<ContactTemp, object>> { 
       (ContactTemp contact) => new { contact.State, contact.City } })) 
     { 
      Console.WriteLine($"City:{contact.City}, State:{contact.State}"); 
     } 
     // This will output: 
     // City: 1, State: 1 
     // City: 1, State: 2 
     // City: 2, State: 1 
     // City: 2, State: 2 
0

나는

public class ContactTemp 
{ 
    public string CITY{} 
    public int STATE{} 

} 

이 목록 "ContactTempList"와 같은 클래스가 중복이있을 것이다 생각합니다. CITY와 STATE가 중복되는 목록에서 항목을 찾아 제거하려고합니다.

나는이 (뚜렷한처럼) 각 "유형"에 대한 하나 개의 항목을 반환합니다 것을 의미한다 (그래서 당신은 A가, A는, B, C가가, B, C를를 반환합니다 경우)

List<ContactTemp> noDups = ContactTempList.GroupBy(d => new {d.CITY,d.STATE}) 
           .Select(d => d.First()) 
           .ToList(); 

당신은 중복이없는 요소 만 (당신이 A, A는, B, C가 반환됩니다 B, C가 있다면 그렇게)하려면 다음

List<ContactTemp> noDups = ContactTempList.GroupBy(d => new {d.CITY,d.STATE}) 
           .Where(d => d.Count() == 1) 
           .Select(d => d.First()) 
           .ToList(); 
0

당신은 동일한 서명 반사를 통해 그것을 달성 할 수 즉, 임의 개수의 열 :

public List<ContactTemp> RemoveDupliacacse(List<ContactTemp> ContactTempList, 
    List<string> objcolumn) 
{    
    var type = typeof(ContactTemp); 
    foreach (var column in objcolumn) 
    { 
     var property = type.GetProperty(column); 
     ContactTempList = ContactTempList.GroupBy(x => property.GetValue(x)) 
             .Select(x => x.First()).ToList(); 
    } 
    return ContactTempList; 
}