2015-09-25 90 views
6

我有一個包含多個屬性的對象列表。這是對象。根據分組刪除除列表中的所有對象

public class DataPoint 
{ 
    private readonly string uniqueId; 
    public DataPoint(string uid) 
    { 
     this.uniqueId = uid; 
    } 

    public string UniqueId 
    { 
     get 
     { 
      return this.uniqueId; 
     } 
    } 

    public string ScannerID { get; set; } 

    public DateTime ScanDate { get; set; } 
} 

現在在我的代碼中,我有一個巨大的這些列表,幾百或幾千。

每個數據點對象都屬於某種類型的掃描儀,並且具有掃描日期。我想刪除在同一天掃描的任何數據點,但給定機器的最後一個數據點除外。

我嘗試使用LINQ如下,但沒有奏效。我仍然有很多重複的數據點。

this.allData = this.allData.GroupBy(g => g.ScannerID) 
        .Select(s => s.OrderByDescending(o => o.ScanDate)) 
        .First() 
        .ToList();` 

我需要用掃描儀ID對數據點進行分組,因爲可能有同一天在不同機器上掃描的數據點。如果有多個,我只需要一天中的最後一個數據點。

編輯說明 - 上一個數據點是指給定機器的給定掃描日期的最後掃描數據點。我希望有所幫助。因此,當按掃描儀ID進行分組時,我試圖按掃描日期排序,然後只保留多次掃描的最後掃描日期。

這裏是2個機一些測試數據:

Unique ID Scanner ID  Scan Date 
A1JN221169H07 49374 2003-02-21 15:12:53.000 
A1JN22116BK08 49374 2003-02-21 15:14:08.000 
A1JN22116DN09 49374 2003-02-21 15:15:23.000 
A1JN22116FP0A 49374 2003-02-21 15:16:37.000 
A1JOA050U900J 80354 2004-10-05 10:53:24.000 
A1JOA050UB30K 80354 2004-10-05 10:54:39.000 
A1JOA050UD60L 80354 2004-10-05 10:55:54.000 
A1JOA050UF80M 80354 2004-10-05 10:57:08.000 
A1JOA0600O202 80354 2004-10-06 08:38:26.000 
+1

你知道你可以做一個只讀自動屬性並擺脫後臺字段'公共字符串UniqueId {獲取;私人設置; }'。 – juharr

+0

您還應該獲得該測試數據的預期結果。 – juharr

回答

5

我想刪除已掃描當天,除了對給定機器最後一個任何數據點。

所以我假設你想同時使用ScanDateScannerID。下面是代碼:

var result = dataPoints.GroupBy(i => new { i.ScanDate.Date, i.ScannerID }) 
         .OrderByDescending(i => i.Key.Date) 
         .Select(i => i.First()) 
         .ToList(); 
+0

它會命令'ScanDate',所以你可以使用'Last'? – ieaglle

+0

這將根據'ScanDate'和'ScannerID'進行分組,如果最後一個表示最後輸入的值,那麼這就足夠了,但如果他是按日期排列的最後一個,那麼我必須編輯我的答案。 –

+1

我認爲你實際上希望在'i.ScanDate.Date'上進行分組,因爲OP表示_scanned在同一天_。然後按'ScanDate'命令。 – juharr

-1

正如順便說一句,這個類可能是,如果我理解你正確地這是你想要的東西定義爲

public class DataPoint 
{ 
    public DataPoint(string uid) 
    { 
    UniqueId = uid; 
    } 

public string UniqueId {get; private set; } 
public string ScannerID { get; set; } 
public DateTime ScanDate { get; set; } 

}

+1

這真的應該是一個評論,而不是一個答案。有點像我已經提出的評論。 – juharr

+0

@juharr,對不起,我在添加評論時正在輸入內容。但是,我想在需要的地方展示更少的代碼行,這對於評論來說很重要。這就是爲什麼我在前面加上「就像旁邊一樣」。 –

1

var result = dataPoints.GroupBy(i => new { i.ScanDate.Date, i.ScannerID }) 
         .Select(i => i.OrderBy(x => x.ScanDate).Last()) 
         .ToList(); 

這組由掃描儀ID和天(SacnnerDate.Date將爲零輸出的時間部分),那麼對於由ScanDate每個分組它的命令(因爲基團是在同一天,這將訂單上的時間)並採取最後。因此,對於每一天,每個掃描儀都會得到一個結果,每個掃描儀在當天具有最新的ScanDate