C# 整数范围重叠验证
我已经在论坛上看到了一些帖子,但到目前为止还没有明确的答案。我想查一份年龄表。我想确保年龄范围不会重叠。关键的一点是开始和结束年龄可以是相同的数字,这应该不会导致发现重叠 任何帮助都会很好 示例代码C# 整数范围重叠验证,c#,.net,overlap,range,C#,.net,Overlap,Range,我已经在论坛上看到了一些帖子,但到目前为止还没有明确的答案。我想查一份年龄表。我想确保年龄范围不会重叠。关键的一点是开始和结束年龄可以是相同的数字,这应该不会导致发现重叠 任何帮助都会很好 示例代码 namespace RangeValidation { public class RangeValidate { private readonly IList<Age> _listOfRanges = new List<Age>();
namespace RangeValidation
{
public class RangeValidate
{
private readonly IList<Age> _listOfRanges = new List<Age>();
private readonly IList<Age> _secondListOfRanges = new List<Age>();
public void Validate()
{
_listOfRanges.Add(new Age { BeginingAge = 20, EndingAge = 20 });
_listOfRanges.Add(new Age { BeginingAge = 21, EndingAge = 30 });
_listOfRanges.Add(new Age { BeginingAge = 31, EndingAge = 60 });
_secondListOfRanges.Add(new Age { BeginingAge = 20, EndingAge = 20 });
_secondListOfRanges.Add(new Age { BeginingAge = 20, EndingAge = 30 });
_secondListOfRanges.Add(new Age { BeginingAge = 31, EndingAge = 60 });
Debug.Write(Overlaps(_listOfRanges).ToString()); // NO OVERLAPS
Debug.Write(Overlaps(_secondListOfRanges).ToString()); // Has overlaps
}
private static bool Overlaps(IEnumerable<Age> listOfRanges)
{
return true; // needs implementation here
}
}
public class Age
{
public int BeginingAge
{
get;
set;
}
public int EndingAge
{
get;
set;
}
}
命名空间范围验证
{
公共类范围验证
{
私有只读IList_listOfRanges=新列表();
私有只读IList_secondListOfRanges=新列表();
public void Validate()
{
_添加(新年龄{BeginingAge=20,EndingAge=20});
_添加(新年龄{BeginingAge=21,EndingAge=30});
_添加(新年龄{BeginingAge=31,EndingAge=60});
_添加(新年龄{BeginingAge=20,EndingAge=20});
_添加(新年龄{BeginingAge=20,EndingAge=30});
_添加(新年龄{BeginingAge=31,EndingAge=60});
Debug.Write(重叠(_listOfRanges.ToString());//无重叠
Debug.Write(重叠(_secondListOfRanges.ToString());//有重叠
}
私有静态布尔重叠(IEnumerable listOfRanges)
{
return true;//此处需要实现
}
}
公课年龄
{
公共国际开端
{
得到;
设置
}
公共尾端
{
得到;
设置
}
}
}此代码适用于您:
private static bool Overlaps(IEnumerable<Age> listOfRanges)
{
bool isOverlaps = false;
foreach (var range in listOfRanges)
{
if (listOfRanges.Count(x =>
(x.BeginingAge >= range.BeginingAge && x.BeginingAge <= range.EndingAge)
|| (x.EndingAge >= range.BeginingAge && x.EndingAge <= range.EndingAge)) > 1)
{
isOverlaps = true;
break;
}
}
return isOverlaps;
}
私有静态布尔重叠(IEnumerable listOfRanges)
{
bool isOverlaps=假;
foreach(listOfRanges中的变量范围)
{
if(listOfRanges.Count)(x=>
(x.BeginingAge>=range.BeginingAge&&x.BeginingAge=range.BeginingAge&&x.EndingAge 1)
{
isOverlaps=真;
打破
}
}
返回等溢出;
}
但正如Harrison所说,尝试自己编写此代码将是一个好主意。也许会有一个比mines更好的解决方案,但它是有效的。AnO(n log n)
解决方案:
private static bool Overlaps(IEnumerable<Age> listOfRanges)
{
List<Age> sorted = listOfRanges.OrderBy(o=>o.BeginingAge).ToList();
for(int i=1; i<sorted.Count; ++i)
{
if(sorted[i-1].EndingAge > sorted[i].BeginingAge) //change to >= is needed
return false;
}
return true;
}
私有静态布尔重叠(IEnumerable listOfRanges)
{
List sorted=listOfRanges.OrderBy(o=>o.BeginingAge.ToList();
对于(int i=1;i已排序[i].BeginingAge)//需要更改为>=
返回false;
}
返回true;
}
您的代码中关于哪些内容应该重叠的注释似乎与您关于允许相同的开始和结束年龄的文本不一致…虽然您的代码显示了您的设置/要求,但您尚未尝试编写代码。请尝试一下,然后告诉我们您遇到的问题。这是错误的。如果开始e range.EndingAge年龄重叠,但返回值为false。