我的List<long> MyList
包含 7031320272,7031320273,7031320277,7031323700 的长数字
和范围,假设[ 7031320270,7031324000 ]。
现在我想找到MyList
中缺少的那个范围内的所有数字
我已经尝试了Enumerable.Range
没有运气,因为它只处理int值,
as given here
我知道列表中的第一个和最后一个号码。如何知道给定范围内的缺失
答案 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;
}
但这仍然是循环..