将项添加到另一个列表中的List <tuple>

时间:2017-10-19 18:57:45

标签: c# list

我制作了一个临时应用程序来模仿我需要合并到Web服务中的一些行为,该服务从数据库返回数据并使用返回的数据创建动态Google Charts。

到目前为止,我所拥有的是

class Program
{
    static void Main(string[] args)
    {

        var tupleMissingBeginning = new List<Tuple<DateTime, int>>
        {
            Tuple.Create( new DateTime(2017, 5, 1), 25),
            Tuple.Create( new DateTime(2017, 6, 1), 35)
        };

        var tupleMissingMiddle = new List<Tuple<DateTime, int>>
        {
            Tuple.Create( new DateTime(2016, 12, 1), 25),
            Tuple.Create( new DateTime(2017, 1, 1), 20),
            Tuple.Create( new DateTime(2017, 2, 1), 30),
            Tuple.Create( new DateTime(2017, 3, 1), 25),
            Tuple.Create( new DateTime(2017, 6, 1), 35)
        };

        var tupleMissingEnd = new List<Tuple<DateTime, int>>
        {
            Tuple.Create( new DateTime(2017, 1, 1), 20),
            Tuple.Create( new DateTime(2017, 2, 1), 30),
            Tuple.Create( new DateTime(2017, 3, 1), 25)
        };

        var tupleMissingBeginningAndEnd = new List<Tuple<DateTime, int>>
        {
            Tuple.Create( new DateTime(2017, 3, 1), 20),
            Tuple.Create( new DateTime(2017, 4, 1), 30),
            Tuple.Create( new DateTime(2017, 5, 1), 25)
        };

        DateTime minDate = DateTime.MaxValue;
        DateTime maxDate = DateTime.MinValue;

        Console.WriteLine("MinDate: " + minDate);
        Console.WriteLine("MaxDate: " + maxDate);
        Console.WriteLine("");

        List<List<Tuple<DateTime, int>>> myList = new List<List<Tuple<DateTime, int>>>();

        myList.Add(tupleMissingBeginning);
        myList.Add(tupleMissingMiddle);
        myList.Add(tupleMissingEnd);
        myList.Add(tupleMissingBeginningAndEnd);

        foreach (var item in myList)
        {
            for (int i = 0; i < item.Count; i++)
            {
                Console.WriteLine(item[i] + " . . . . MinDate: " + minDate + ", MaxDate: " + maxDate);
                if (item[i].Item1 < minDate)
                {
                    minDate = item[i].Item1;
                }
                if (item[i].Item1 > maxDate)
                {
                    maxDate = item[i].Item1;
                }

            }
            Console.WriteLine();
        }

        Console.WriteLine();
        Console.WriteLine("MinDate: " + minDate);
        Console.WriteLine("MaxDate: " + maxDate);


        foreach (var item in myList) // for each list<tuple<DateTime, int>> in myList,
        {

            while (minDate <= maxDate)
            {
                Console.WriteLine(minDate);
                minDate = minDate.AddMonths(1);
            }
        }
    }
}

输出如下: image of output

在某个地方以及某种方式在第二个循环中我需要使用minDate和maxDate来检查某个项目是否存在于该特定列表的该位置。基本上,由于minDate是12/1/2016而maxDate是6/1/2017(这些只是任意日期,可以是任何东西)我需要确保每个List<Tuple<DateTime, int>>包含相同数量的元素,如果在那个索引处没有任何内容,我可以在该月的第一天插入0。

我尝试使用for循环,它使用原始DateTimes作为索引器和条件,并且只使用月份但遇到了新年的问题以及插入值的整个过程。

编辑:这是我目前拥有的:

        foreach (var item in myList) // for each list<tuple<DateTime, int>> in myList,
        {
            DateTime newDate = minDate;
            while (newDate <= maxDate)
            {
                //Console.WriteLine(minDate);
                for (int i = 0; i < item.Count; i++)
                {
                    bool containsDate = item.Any(D => D.Item1 == newDate);
                    if (!containsDate)
                    {
                        item.Insert(i, new Tuple<DateTime, int>(newDate, 0));
                    }
                }
                newDate = newDate.AddMonths(1);
            }
        }

产生以下输出: second output image

所以它只是在那里,它添加了所有0,它只是没有把它们放在正确的位置。

1 个答案:

答案 0 :(得分:2)

我想我发现了你的问题。通常,使用foreach很难修改您正在迭代的内容。

此解决方案将在最小值和最大值之间的每个月进行迭代。然后它将遍历每个列表。如果列表没有该月份,则将其插入列表中。

for (int i = 0; minDate <= maxDate; i++)
{
    for (int list = 0; list < myList.Count; list++)
    {
        if (myList[list].Count <= i || myList[list][i].Item1 != minDate)
        {
            myList[list].Insert(i, Tuple.Create(minDate, 0));
        }
    }

    minDate = minDate.AddMonths(1);
}

您还可以使用日期作为迭代器并在结尾处进行排序:

for (var i = minDate; i <= maxDate; i = i.AddMonths(1))
{
    for (int list = 0; list < myList.Count; list++)
    {
        if (!myList[list].Any(tuple => tuple.Item1 == i))
        {
            myList[list].Add(Tuple.Create(i, 0));
        }
    }
}

myList.ForEach(item => item.Sort((x, y) => x.Item1.CompareTo(y.Item1)));

您还可以通过首先展平来找到最小值和最大值:

var dates = myList.SelectMany(list => list).Select(item => item.Item1);
minDate = dates.Min();
maxDate = dates.Max();