2014-02-10 21 views
2

我的元組分組3元組和搜索元組的列表在C#中一個特定的值

List<Tuple<string,string,string>> 

元組代表的名單<ID#, Session#, Date>

我的任務是當用戶想添加新的ID#,我檢查看(1)如果該ID存在,如果是的話,我們是否在同一日期。如果是這樣,我只是返回該元組(用戶使用會話#和其他東西)。如果沒有,我創建一個新的元組,會話ID加1並返回。

在我看來,這樣做是可取的,我可以通過ID,然後通過會話#分組我的元組。我認爲這應該可以通過LINQ來實現(儘管使用LINQ並不重要)。請注意,效率並不是真正的問題。可讀性更重要。我見過很多涉及2元組的stackoverflow問題,例如: Sort and Group in LINQ 當我試圖適應我的問題,我失去了我的日期信息。

那麼如何通過ID對3元組進行分組,以便我可以找出我添加的ID是否已經存在,如果是,是否需要創建新的Session#。

謝謝, 戴夫

根據裏德的答案,這我標誌着作爲答案,我使用下面的代碼(我敢肯定LINQ專家可以改善!)。我採取了裏德的中心思想,並簡單地添加了一個支票來擁有正確的會話ID。這是id可以存在,但我們有不同的日期,因此一個新的會話。會話ID應該由1

public static Tuple<string, string, string> GetPatientRecord(string ID) 
    { 
     DateTime dt = DateTime.Now; 
     string newDate = dt.ToString("MMddyy-hhmmss"); 
     var match = tuples.FindAll(t => t.Item1 == ID); 
     int maxSessionId = 0; 
     if (match != null) 
     { 

      foreach (Tuple<string, string, string> tuple in match) 
      { 
       if (Int32.Parse(tuple.Item2) > maxSessionId) 
        maxSessionId = Int32.Parse(tuple.Item2); 

       DateTime tupleDateTime = DateTime.ParseExact(tuple.Item3,"MMddyy-hhmmss",null); 

       if (tupleDateTime.Date == dt.Date) 
        return tuple; 
      } 

     } 
     // following lines will take care of case of no ID or ID present, but not this date 
     Tuple<string, string, string> newTuple = new Tuple<string, string, string>(ID, (++maxSessionId).ToString(), newDate); 
     tuples.Add(newTuple); 
     return newTuple; 
    } 
+2

你確定你想在這裏使用一個元組如果您正在使用項目工作多在所有我建議讓他們一流的POCO的,而不是元組,以幫助說明什麼他們的屬性表示,減少意外錯誤並增強代碼的可維護性。 – Kevin

+0

@Kevin我同意100% - 但它實際上並沒有真正改變代碼太多(除了使用'.ID'而不是'.Item1'等... –

+0

@ReedCopsey同意......我upvoted你的答案。我只是想做一個風格評論,以防我從戴夫或其他讀者那裏繼承代碼。 :) – Kevin

回答

3

遞增您可以通過一個匿名類型(即使用GroupBy與兩元組項目:...GroupBy(t => new { t.Item1, t.Item3 }),但在這種情況下,因爲你只是想找到一個比賽,我會使用FirstOrDefault

var match = tuples.FirstOrDefault(t => t.Item1 == ID && t.Item3 == theDate); 

if (match != null) 
    return match; 

// Build new tuple as needed 
+0

謝謝里德。標記爲答案。我需要在編輯的問題中添加更多的代碼。然而,我正在使用你的中心思想。 – Dave

相關問題