在数组中查找遗漏的元素

时间:2016-02-15 00:30:54

标签: c# .net arrays

我有数字1到31的数组(每月几天) 在我这边,我想找到所有错过的号码。 这是我的解决方案,但我不确定这是一个好方法。

var result = new List<int>();
int[] days = GetSelectedDays(); //I recive array with 1..31 with some missing elements sometimes (without "5" as example it depends if user has selected this number)
for (int i=0; i <30; i++)
{
  if (!days.Contains(i))
  result.Add(i);
}

3 个答案:

答案 0 :(得分:4)

您可以使用LINQ Except

var result = Enumerable.Range(1, 31).Except(days);

答案 1 :(得分:0)

看起来您正在检查0..29范围内的数字而不是1..31。我唯一的建议是将for循环更改为:

for(int i = 1; i <= 31; i ++)

答案 2 :(得分:0)

首先,当你添加一个月的日子时,可能更容易循环一个DateTimes循环,即

var missedDateDictionary = new Dictionary<DateTime, bool>(); // or other value
var date = new DateTime(2016, 01, 01);

for (int i = 0 ; i < 32 ; i++)
{
    var newDate = date.AddDays(i);

    //do something with adding / not adding date

    if (notDoneSomething)
        missedDateDictionary.Add(newDate, true)
}

这里的前提是您添加的每个DateTime都是唯一的。

如果您无法保证,您的解决方案非常有效,但可以使用一些优化。

  1. 使用最大值初始化arary:int[31] days = GetSelectedDays();

  2. 一个月可以有31天:for (int i = 1; i <32; i++)

  3. 如果可能,请填写result

  4. 循环中的GetSelecteDays()