从长列表中找到缺少的号码

时间:2013-07-10 13:29:53

标签: c# linq

我的List<long> MyList包含 7031320272,7031320273,7031320277,7031323700 的长数字   和范围,假设[ 7031320270,7031324000 ]。

现在我想找到MyList中缺少的那个范围内的所有数字 我已经尝试了Enumerable.Range没有运气,因为它只处理int值, as given here

修改

我知道列表中的第一个和最后一个号码。如何知道给定范围内的缺失

5 个答案:

答案 0 :(得分:3)

您可以使用与您链接的帖子类似的方法,只是明确使用的哈希集:

IEnumerable<long> GetMissingNumbers(long rangeStart, long rangeEnd, 
                                    IEnumerable<long> numbers)
{
    var existingNumbers = new HashSet<long>(numbers);

    for(long n = rangeStart;n<=rangeEnd;n++)
    {
        if(!existingNumbers.Contains(n))
            yield return n;
    }
}

答案 1 :(得分:2)

假设我们有:

List<long> FullList //Contains all numbers in range
List<long> MyList // My List

你可以去

var Missing = FullList.FindAll( x => !(MyList .Contains(x)));

答案 2 :(得分:2)

由于Range仅处理整数,我们只需要创建一个处理多头的版本:

public static IEnumerable<long> Range(long start, long count)
{
    for (long i = 0; i < count; i++)
    {
        yield return start++;
    }
}

使用它我们可以轻松地创建您想要的方法:

public IEnumerable<long> GetMissingNumbers(long rangeStart, long rangeEnd,
                                IEnumerable<long> numbers)
{
    return Range(rangeStart, rangeEnd - rangeStart)
            .Except(numbers);
}

答案 3 :(得分:1)

如果您愿意,可以使用自己的范围方法返回长值。

public static  IEnumerable<long> RangeLong(long start,long count)
{
    for(long l=start;l<=start+count;l++)
        yield return l;
}

linq中没有其他方法可以返回长值范围。

答案 4 :(得分:0)

这是你想要的吗?

List<long> FindMissing(List<long> theList, long lowerBound, long upperBound)
{
     var missVals = new List<long>();
     for(long x =lowerBound; x <= upperBound; x++)
         if(!theList.Contains(x)) 
              missVals.Add(x);
     return missVals;
}

或................................

List<long> FindMissing(List<long> theList, long lowerBound, long upperBound)
{      
     var missVals = new List<long>();
     while (lowerBound++ <= upperBound)
         if(!theList.Contains(lowerBound)) 
              missVals.Add(lowerBound);
     return missVals;
}

但这仍然是循环..