我有List<long> MyList
其中包含长数字,如7031320272、7031320273、7031320277、7031323700
和一个范围,比方说 [ 7031320270, 7031324000 ]。
现在我想找到MyList
我已经尝试过Enumerable.Range
但没有运气的该范围内缺少的所有数字,因为它只处理 int 值,
如此处给出
编辑
我知道列表中的第一个和最后一个数字。如何知道给定范围内的缺失值
您可以使用与您链接的帖子类似的方法,只是明确说明使用的哈希集:
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;
}
}
假设我们有:
List<long> FullList //Contains all numbers in range
List<long> MyList // My List
你可以去
var Missing = FullList.FindAll( x => !(MyList .Contains(x)));
由于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);
}
如果您愿意,您可以创建自己的范围方法来返回长值。
public static IEnumerable<long> RangeLong(long start,long count)
{
for(long l=start;l<=start+count;l++)
yield return l;
}
linq 中没有其他方法可以返回 long 值的范围。
这是你想要的吗 ?
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;
}
但这仍在循环..