我制作了一个临时应用程序来模仿我需要合并到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);
}
}
}
}
在某个地方以及某种方式在第二个循环中我需要使用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);
}
}
所以它只是在那里,它添加了所有0,它只是没有把它们放在正确的位置。
答案 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();