-1

我有List<long> MyList 其中包含长数字,如7031320272、7031320273、7031320277、7031323700
和一个范围,比方说 [ 7031320270, 7031324000 ]。

现在我想找到MyList
我已经尝试过Enumerable.Range但没有运气的该范围内缺少的所有数字,因为它只处理 int 值, 如此处给出

编辑

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

4

5 回答 5

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;
    }
}
于 2013-07-10T13:37:54.273 回答
2

假设我们有:

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

你可以去

var Missing = FullList.FindAll( x => !(MyList .Contains(x)));
于 2013-07-10T13:42:40.833 回答
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);
}
于 2013-07-10T14:21:14.650 回答
1

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

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

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

于 2013-07-10T13:44:28.157 回答
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;
}

但这仍在循环..

于 2013-07-10T13:35:29.327 回答