2017-05-08 13 views
1

私は次のレコードを持っているかのような特定のフィールドに基づいてデータテーブルと条件C#フィールドに基づいてデータテーブル重複を削除し、条件

から重複を削除することが可能です:

名:アリ

appointment_type:歯科

appointment_date:2017年8月5日午前8時00分〇​​〇秒

名:アリ

appointment_type:歯科

appointment_date:2017年8月5日午前16時00分00秒

上記の例から、患者アリは(私は後の予定(複数可)を削除する2件の予定を、持っていますこれは、 は「アリ」患者のすべての予定を削除し、最も早いだけ

が、それはLINQでそれを行うことが可能である保つ言い換えれば、2017年8月5日午前16時00分○○秒)

にありますか?

+0

最初にフィルタを適用し、ここで説明するようにRemoveRangeを適用します。http://stackoverflow.com/questions/14746783/remove-all-but-the-first-item-in-a-list –

答えて

1

あなたは、各グループから、取るだけFirst(早い)AppointmentDateに基づいて、各グループをGroupBy項目にしたいし、その後OrderByかもしれません。

List<Patient> patients = new List<Patient>(); //change this with your actual list/IEnumerable 

IEnumerable<Patient> earliestAppointmentRecorded = patients.GroupBy(x => x.Name.ToLower().Trim()) 
    .Select(x => x.OrderBy(y => y.AppointmentDate).First()); 

classと仮定すると、以下のようなものです::結果は唯一の最も初期の約束になります

public class Patient { 
    public string Name { get; set; } 
    public string AppointmentType { get; set; } 
    public DateTime AppointmentDate { get; set; } 

}; 

そして、たとえば、あなたがearliestAppointmentRecordedのもので、以前のレコードを交換したい、あなたは可能性単に実行します。

patients = earliestAppointmentRecorded.ToList(); 
+0

ありがとうございます!それは完全に働いた –

+0

あなたはようこそ.. :) – Ian

0

は、次の試してみてください。

 static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("name", typeof(string)); 
      dt.Columns.Add("appointment_type", typeof(string)); 
      dt.Columns.Add("appointment_date", typeof(DateTime)); 

      dt.Rows.Add(new object[] { "Ali", "dental", DateTime.Parse("8/5/2017 08:00:00")}); 
      dt.Rows.Add(new object[] { "Ali", "dental", DateTime.Parse("8/5/2017 16:00:00")}); 

      var groups = dt.AsEnumerable().GroupBy(x => new { name = x.Field<string>("name"), type = x.Field<string>("appointment_type") }).ToList(); 

      dt = groups.Select(x => x.OrderBy(y => y.Field<DateTime>("appointment_date")).LastOrDefault()).CopyToDataTable(); 

     } 
関連する問題