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,假设我有一个包含三列的数据表:timestamp、curveID和price。我想给出一个时间,然后为每天选择时间戳、曲线ID和价格,但前提是所有曲线ID都存在 问题是,并非所有数据都存在,因此在10:00:00时,可能只有curveID 1的数据,而ID=2的数据可能没有,以此类推 我想我可以执行以下操作来选择第一个数据集,其中所有CurveID都存在,并且时间大于或等于我的标准: dataSet.ReadXml(@"C:\temp\Prices.xml", XmlReadMo

假设我有一个包含三列的数据表:timestamp、curveID和price。我想给出一个时间,然后为每天选择时间戳、曲线ID和价格,但前提是所有曲线ID都存在

问题是,并非所有数据都存在,因此在10:00:00时,可能只有curveID 1的数据,而ID=2的数据可能没有,以此类推

我想我可以执行以下操作来选择第一个数据集,其中所有CurveID都存在,并且时间大于或等于我的标准:

        dataSet.ReadXml(@"C:\temp\Prices.xml", XmlReadMode.InferTypedSchema);
        ds = dataSet.Tables[0];
        var dt = ds.Clone();
        int criteria = 10;
        var list = ds.AsEnumerable().Where(x => x.Field<DateTime>("Timestamp").Hour >= criteria)
                    .GroupBy(x => new{Date = x.Field<DateTime>("Timestamp").Date, Curve = x.Field<object>("CurveID")})
                    .First().ToList();
dataSet.ReadXml(@“C:\temp\Prices.xml”,XmlReadMode.InferTypedSchema);
ds=dataSet.Tables[0];
var dt=ds.Clone();
int标准=10;
var list=ds.AsEnumerable()。其中(x=>x.Field(“时间戳”).Hour>=标准)
.GroupBy(x=>new{Date=x.Field(“Timestamp”).Date,Curve=x.Field(“CurveID”)})
.First().ToList();
但是,对于同一曲线ID,这将在同一天(不同时间)返回多条记录。 我只想返回每天每个curveID的一条记录,时间接近所有curveID出现的标准时间


为了清楚起见,假设我正在寻找curveID 1和2,如果在第1天的10:00:00时,只有curveID 1存在,但curveID 2缺失,我需要检查在10:01:00时两者是否都存在,如果是,我将从那时起的两个记录集作为当天的记录集。我必须每天在数据库中检查这一点

您可能希望先按日期分组,然后使用以下内容按小时分组

group thing by new {
   firstThing = x.Field<DateTime>("TimeStamp").Date, 
   secondThing = x.Field<DateTime>("TimeStamp").Date.Hour, 
}
按新内容分组{
firstThing=x.Field(“时间戳”).Date,
secondThing=x.Field(“时间戳”).Date.Hour,
}
我的语法可能有点偏离,但这应该会让您朝着正确的方向前进

//标准是整数小时表示法
// criteria is your integer Hour representation
var criteria = 10;
// array of curveIds to look for
var curveIds = new int[] {1, 2};
var result = 
    // grouping by date first
    ds.GroupBy(x => x.Field<DateTime>("Timestamp").Date, 
        (date, items) => new { date, items = items
            // items with the same timestamp go to one group
            .GroupBy(i => i.Field<DateTime>("Timestamp"), (datetime, timestampItems) => new { datetime, timestampItems })
            // filter by criteria
            .Where(dti => dti.datetime.Hour >= criteria)
            // filter by curveIds
            .Where(dti => curveIds.All(cid => dti.timestampItems.Any(tsi => tsi.Field<int>("curveID") == cid)))
            .OrderBy(dti => dti.datetime)
            .FirstOrDefault() });
var标准=10; //要查找的曲线的数组 var curveIds=newint[]{1,2}; var结果= //先按日期分组 ds.GroupBy(x=>x.Field(“时间戳”).Date, (日期,项目)=>新建{日期,项目=项目 //具有相同时间戳的项目进入一个组 .GroupBy(i=>i.Field(“Timestamp”),(datetime,timestampItems)=>new{datetime,timestampItems}) //按条件筛选 .其中(dti=>dti.datetime.Hour>=标准) //曲线滤波器 .Where(dti=>curveIds.All(cid=>dti.timestampItems.Any(tsi=>tsi.Field(“curveID”)==cid))) .OrderBy(dti=>dti.datetime) .FirstOrDefault()});

最后,您将收到一个“每天”的结果,该结果符合您提到的所有要求:在某些标准之后出现,拥有所有
曲线,成为最早的一个。

您希望在该记录中包含什么?一笔钱?第一个?平均值?仅仅是值,时间戳和curveID的每个组合只有一条记录,那么首先说每一行由tuple(时间戳,curveID)定义是否正确?你说“所有曲线”是什么意思?你们有多少个?是的,一个元组,有很多,但我知道我要过滤什么。谢谢佩德罗。但是我认为这没有多大帮助,因为我有分钟的数据,如果我按分钟分组,我仍然不知道如何迭代数据以选择一分钟,其中我需要的所有ID都存在。你是否缺少一些括号?@nik,如果你在运行代码时遇到任何问题,请告诉我。对不起,我离开办公桌几分钟了。我遇到很多错误(无效的匿名类型成员声明和一些其他错误),请让我尝试解决这些问题it@nik,修复了缺少的
new
关键字。我仍然在此=>new{date,items上遇到匿名类型错误