我有一个元组列表
List<Tuple<string,string,string>>
元组代表<ID#, Session#, Date>
我的任务是当用户想要添加新ID时,我检查(1)该ID是否存在,如果存在,我们是否在同一日期。如果是这样,我只返回该元组(用户使用Session#和其他东西)。如果没有,我创建一个新的元组,会话ID加1并返回。
在我看来,我希望按ID分组我的元组,然后按Session#分组。我认为这应该是LINQ可行的(尽管使用LINQ并不重要)。请注意,效率并不是真正的问题。可读性更重要。我见过许多处理2元组的stackoverflow问题,例如: Sort and Group in LINQ 当我试图让这个问题适应我的问题时,我丢失了日期信息。
然后如何按ID分组3元组,这样我就可以知道我添加的ID是否已经存在,如果是,我是否需要创建新的Session#。
谢谢, 戴夫
基于Reed的回答,我将其作为答案,我使用以下代码(我确信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;
}
答案 0 :(得分: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