将3元组分组并在C#中搜索特定值的元组列表

时间:2014-02-10 20:18:32

标签: c# linq tuples

我有一个元组列表

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;
    }

1 个答案:

答案 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