Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查列表中多个范围的不连续性_C#_Linq - Fatal编程技术网

C# 检查列表中多个范围的不连续性

C# 检查列表中多个范围的不连续性,c#,linq,C#,Linq,我想问一下,Linq是否有办法检查多个范围的不连续性,例如,我们有一个Agrange类: public class AgeRange { public int firstValue {get;set;} public int secondValue {get;set;} } var-ageRange1=新的AgeRange(0,2);//区间[0,2] var Agrange 2=新的Agrange(4,10);//区间[4,10] var AgeRange 3=新的AgeRange(11,

我想问一下,Linq是否有办法检查多个范围的不连续性,例如,我们有一个Agrange类:

public class AgeRange
{
public int firstValue {get;set;}
public int secondValue {get;set;}
} 
var-ageRange1=新的AgeRange(0,2);//区间[0,2]
var Agrange 2=新的Agrange(4,10);//区间[4,10]
var AgeRange 3=新的AgeRange(11,int.MaxValue);//区间[11,+oo[
var ageRangeList=新列表();
ageRangeList.Add(ageRange1);
ageRangeList.Add(ageRange2);
ageRangeList.Add(ageRange3);
在这个例子中,我们在第一个范围和第二个范围之间有一个不连续性。 在Linq中是否有一种方法可以检查Ageranglist中元素之间的不连续性?
谢谢您的帮助。

假设
firstValue
始终是a.firstValue)。Dump() .First(); var结果=Angelist .OrderBy(a=>a.firstValue) .合计( (hasGap:false,s:start.secondValue), (元组,范围)=> { if(tuple.hasGap) { 返回元组; } 其他的 { var max=Math.max(tuple.s,tuple.s+1);//hacky溢出保护 如果(最大值<范围值) { 返回值(true,tuple.s); } 其他的 { 返回值(false,Math.Max(tuple.s,range.secondValue)); } } }) .哈斯盖普;
这种方法的缺点是,它仍然需要在所有年龄段中循环使用。

如果你想找到第一个不连续性并在其他地方使用该信息

public static IEnumerable<AgeRange> FindDiscontinuity(List<AgeRange> ageRangeList) {
        foreach(var ageRange in ageRangeList.Zip(ageRangeList.Skip(1), (a, b) => new {Prev = a, Current = b})) {

            if(ageRange.Prev.SecondValue != ageRange.Current.FirstValue) {
                yield return ageRange.Prev;
                yield return ageRange.Current;
                break;
            }
        }
    }

public static void Main()
{
        var ageRange1 = new AgeRange(0, 2);
        var ageRange2 = new AgeRange(4, 10);
        var ageRange3 = new AgeRange(11, int.MaxValue);

        var ageRangeList = new List<AgeRange>();
        ageRangeList.Add(ageRange1);
        ageRangeList.Add(ageRange2);
        ageRangeList.Add(ageRange3);
        var result = FindDiscontinuity(ageRangeList);

        foreach(var ageRange in result) {
            Console.WriteLine("{0}, {1}", ageRange.FirstValue, ageRange.SecondValue);
        }
}
公共静态IEnumerable FindDiscontinuity(列表){
foreach(ageRangeList.Zip中的var ageRange(ageRangeList.Skip(1),(a,b)=>new{Prev=a,Current=b})){
if(ageRange.Prev.SecondValue!=ageRange.Current.FirstValue){
收益率-收益率区间上;
收益率返回范围电流;
打破
}
}
}
公共静态void Main()
{
var Agrange 1=新的Agrange(0,2);
var Agrange 2=新的Agrange(4,10);
var AgeRange 3=新的AgeRange(11,int.MaxValue);
var ageRangeList=新列表();
ageRangeList.Add(ageRange1);
ageRangeList.Add(ageRange2);
ageRangeList.Add(ageRange3);
var结果=FindDiscontinuity(Ageragelist);
foreach(结果中的var Agrange){
WriteLine(“{0},{1}”,ageRange.FirstValue,ageRange.SecondValue);
}
}

您可以更改函数,使其可以返回布尔值而不是数据。

您需要查找所有间隙,或者是否存在间隙?那么基本上您希望得到什么结果?您好,谢谢您的关注,仅此一个,然后我返回列表中存在不连续性。如果范围重叠怎么办?
公共类Agrange()
无效declaration@jira对于重叠,它已经由其他代码管理,在这一步中,我只处理范围不重叠谢谢@guru的建议,在代码改编后,我得到了一个错误:带有语句体的lambda表达式无法转换为表达式树。@Sacamoto您正试图将其转换为某种类型的表达式db query?您应该在问题中提到这一点。如果不想将所有数据提取到c#,您应该研究mongodb js脚本和/或功能。感谢@podlecki的回复,我已经尝试了您的代码,我在foreach级别出错:表达式树中不支持方法Zip:聚合([])。其中(a)
var start = ageRangeList
    .OrderBy(a => a.firstValue).Dump()
    .First();
var result = ageRangeList
    .OrderBy(a => a.firstValue)
    .Aggregate(
        (hasGap: false, s: start.secondValue),
        (tuple, range) =>
        {
            if (tuple.hasGap)
            {
                return tuple;
            }
            else
            {
                var max = Math.Max(tuple.s, tuple.s+1); //hacky overflow protection
                if (max < range.firstValue)
                {
                    return (true, tuple.s);
                }
                else
                {
                    return (false,  Math.Max(tuple.s, range.secondValue));
                }
            }

        })
.hasGap;
public static IEnumerable<AgeRange> FindDiscontinuity(List<AgeRange> ageRangeList) {
        foreach(var ageRange in ageRangeList.Zip(ageRangeList.Skip(1), (a, b) => new {Prev = a, Current = b})) {

            if(ageRange.Prev.SecondValue != ageRange.Current.FirstValue) {
                yield return ageRange.Prev;
                yield return ageRange.Current;
                break;
            }
        }
    }

public static void Main()
{
        var ageRange1 = new AgeRange(0, 2);
        var ageRange2 = new AgeRange(4, 10);
        var ageRange3 = new AgeRange(11, int.MaxValue);

        var ageRangeList = new List<AgeRange>();
        ageRangeList.Add(ageRange1);
        ageRangeList.Add(ageRange2);
        ageRangeList.Add(ageRange3);
        var result = FindDiscontinuity(ageRangeList);

        foreach(var ageRange in result) {
            Console.WriteLine("{0}, {1}", ageRange.FirstValue, ageRange.SecondValue);
        }
}