2017-11-08 8 views
0

私はクラスのリストを持ち、このクラスには2つの列があります。今私は特定の列を使用してそのクラスから重複した行を削除したいと思います。最初の列のみから重複を削除するように、送信列のみから削除するか、両方から削除します。これに対して、次のコードを使用しています。将来、このクラスに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、B、Cを持っている場合、それはA、B、Cを返します)

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

あなたが重複していない(ので、あなたは、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; 
} 
関連する問題