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# Linq生成给定日期范围内缺失记录的列表_C#_Linq - Fatal编程技术网

C# Linq生成给定日期范围内缺失记录的列表

C# Linq生成给定日期范围内缺失记录的列表,c#,linq,C#,Linq,假设我有一个以下类的列表: public class Holding { public string HoldingId{ get; set; } public DateTime date { get; set; } } 在给定的日期范围内,每天都需要等待。我需要能够制作一份该范围内缺失的持股清单 假设我在2010年6月1日至2010年6月5日期间需要检查以下数据: HoldingId Date 1 01-06-2010 1 02-06-20

假设我有一个以下类的列表:

public class Holding
{
  public string HoldingId{ get; set; }      
  public DateTime date { get; set; }
}
在给定的日期范围内,每天都需要等待。我需要能够制作一份该范围内缺失的持股清单

假设我在2010年6月1日至2010年6月5日期间需要检查以下数据:

HoldingId Date
1         01-06-2010
1         02-06-2010
1         04-06-2010
2         02-06-2010
2         03-06-2010
2         05-06-2010
3         03-06-2010
对于这组数据,缺少的持有量为:

HoldingId Date
1         03-06-2010
1         05-06-2010   
2         01-06-2010
2         04-06-2010    
3         01-06-2010
3         02-06-2010
3         04-06-2010
3         05-06-2010
我已使用以下问题的答案列出了日期范围: .

我不太明白如何从这里开始…我想我需要通过HoldingId进行分组,生成一个日期数组,然后执行range.Except(holdings.dates)或类似的操作


有没有人能用Linq很好地解决这个问题呢?

你说得很对;这是我得到的

List<Holding> holdings = new List<Holding>();
holdings.Add(new Holding(){ date=Convert.ToDateTime("01-06-2010"), HoldingId = "1" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("02-06-2010"), HoldingId = "1" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("04-06-2010"), HoldingId = "1" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("02-06-2010"), HoldingId = "2" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("03-06-2010"), HoldingId = "2" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("05-06-2010"), HoldingId = "2" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("03-06-2010"), HoldingId = "3" });

List<DateTime> dateRange = new List<DateTime>();
dateRange.Add(Convert.ToDateTime("01-06-2010"));
dateRange.Add(Convert.ToDateTime("02-06-2010"));
dateRange.Add(Convert.ToDateTime("03-06-2010"));
dateRange.Add(Convert.ToDateTime("04-06-2010"));
dateRange.Add(Convert.ToDateTime("05-06-2010"));

Dictionary<string, List<DateTime>> missingHoldings = new Dictionary<string, List<DateTime>>();

foreach(var holdGrp in  holdings.GroupBy (h => h.HoldingId))
{
    var missingDates = dateRange.Except(holdGrp.Select(h => h.date)).ToList();
    missingHoldings.Add(holdGrp.Key, missingDates);
}
List holdings=newlist();
添加(newholding(){date=Convert.ToDateTime(“01-06-2010”),HoldingId=“1”});
添加(newholding(){date=Convert.ToDateTime(“02-06-2010”),HoldingId=“1”});
添加(newholding(){date=Convert.ToDateTime(“04-06-2010”),HoldingId=“1”});
添加(newholding(){date=Convert.ToDateTime(“02-06-2010”),HoldingId=“2”});
添加(newholding(){date=Convert.ToDateTime(“03-06-2010”),HoldingId=“2”});
添加(newholding(){date=Convert.ToDateTime(“05-06-2010”),HoldingId=“2”});
添加(newholding(){date=Convert.ToDateTime(“03-06-2010”),HoldingId=“3”});
列表日期范围=新列表();
dateRange.Add(转换为ToDateTime(“01-06-2010”));
dateRange.Add(转换为ToDateTime(“02-06-2010”);
dateRange.Add(转换为ToDateTime(“03-06-2010”);
dateRange.Add(转换为ToDateTime(“04-06-2010”);
dateRange.Add(转换为ToDateTime(“05-06-2010”);
Dictionary missingHoldings=新字典();
foreach(holdings.GroupBy中的var holdGrp(h=>h.HoldingId))
{
var missingDates=dateRange.Except(holdGrp.Select(h=>h.date)).ToList();
missingHoldings.Add(holdGrp.Key,missingDates);
}

你的做法非常正确;这是我得到的

List<Holding> holdings = new List<Holding>();
holdings.Add(new Holding(){ date=Convert.ToDateTime("01-06-2010"), HoldingId = "1" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("02-06-2010"), HoldingId = "1" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("04-06-2010"), HoldingId = "1" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("02-06-2010"), HoldingId = "2" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("03-06-2010"), HoldingId = "2" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("05-06-2010"), HoldingId = "2" });
holdings.Add(new Holding(){ date=Convert.ToDateTime("03-06-2010"), HoldingId = "3" });

List<DateTime> dateRange = new List<DateTime>();
dateRange.Add(Convert.ToDateTime("01-06-2010"));
dateRange.Add(Convert.ToDateTime("02-06-2010"));
dateRange.Add(Convert.ToDateTime("03-06-2010"));
dateRange.Add(Convert.ToDateTime("04-06-2010"));
dateRange.Add(Convert.ToDateTime("05-06-2010"));

Dictionary<string, List<DateTime>> missingHoldings = new Dictionary<string, List<DateTime>>();

foreach(var holdGrp in  holdings.GroupBy (h => h.HoldingId))
{
    var missingDates = dateRange.Except(holdGrp.Select(h => h.date)).ToList();
    missingHoldings.Add(holdGrp.Key, missingDates);
}
List holdings=newlist();
添加(newholding(){date=Convert.ToDateTime(“01-06-2010”),HoldingId=“1”});
添加(newholding(){date=Convert.ToDateTime(“02-06-2010”),HoldingId=“1”});
添加(newholding(){date=Convert.ToDateTime(“04-06-2010”),HoldingId=“1”});
添加(newholding(){date=Convert.ToDateTime(“02-06-2010”),HoldingId=“2”});
添加(newholding(){date=Convert.ToDateTime(“03-06-2010”),HoldingId=“2”});
添加(newholding(){date=Convert.ToDateTime(“05-06-2010”),HoldingId=“2”});
添加(newholding(){date=Convert.ToDateTime(“03-06-2010”),HoldingId=“3”});
列表日期范围=新列表();
dateRange.Add(转换为ToDateTime(“01-06-2010”));
dateRange.Add(转换为ToDateTime(“02-06-2010”);
dateRange.Add(转换为ToDateTime(“03-06-2010”);
dateRange.Add(转换为ToDateTime(“04-06-2010”);
dateRange.Add(转换为ToDateTime(“05-06-2010”);
Dictionary missingHoldings=新字典();
foreach(holdings.GroupBy中的var holdGrp(h=>h.HoldingId))
{
var missingDates=dateRange.Except(holdGrp.Select(h=>h.date)).ToList();
missingHoldings.Add(holdGrp.Key,missingDates);
}

另一种方法:

public static List<Holding> MissingHoldings(List<Holding> existingHoldings, DateTime startDate, DateTime endDate)
{
    var missingHoldings = new List<Holding>();
    var holdingIds = existingHoldings.Select(h => h.HoldingId).Distinct().ToList();
    var dates = new List<DateTime>();
    for (var current = startDate.Date; current <= endDate.Date; current = current.AddDays(1))
    {
        dates.Add(current);
    }

    foreach (var holdingId in holdingIds)
    {
        missingHoldings
            .AddRange(
                dates.Where(date => !existingHoldings.Any(h => h.HoldingId == holdingId && h.date == date))
                .Select(date => new Holding {HoldingId = holdingId, date = date}));
    }
    return missingHoldings;
}
public static List MissingHoldings(列出现有控股、DateTime startDate、DateTime endDate)
{
var missingHoldings=新列表();
var holdingIds=existingHoldings.Select(h=>h.HoldingId.Distinct().ToList();
变量日期=新列表();
for(var current=startDate.Date;current!existingHoldings.Any(h=>h.HoldingId==HoldingId&&h.Date==Date))
.Select(date=>newholding{HoldingId=HoldingId,date=date});
}
归还丢失的股份;
}

另一种方法:

public static List<Holding> MissingHoldings(List<Holding> existingHoldings, DateTime startDate, DateTime endDate)
{
    var missingHoldings = new List<Holding>();
    var holdingIds = existingHoldings.Select(h => h.HoldingId).Distinct().ToList();
    var dates = new List<DateTime>();
    for (var current = startDate.Date; current <= endDate.Date; current = current.AddDays(1))
    {
        dates.Add(current);
    }

    foreach (var holdingId in holdingIds)
    {
        missingHoldings
            .AddRange(
                dates.Where(date => !existingHoldings.Any(h => h.HoldingId == holdingId && h.date == date))
                .Select(date => new Holding {HoldingId = holdingId, date = date}));
    }
    return missingHoldings;
}
public static List MissingHoldings(列出现有控股、DateTime startDate、DateTime endDate)
{
var missingHoldings=新列表();
var holdingIds=existingHoldings.Select(h=>h.HoldingId.Distinct().ToList();
变量日期=新列表();
for(var current=startDate.Date;current!existingHoldings.Any(h=>h.HoldingId==HoldingId&&h.Date==Date))
.Select(date=>newholding{HoldingId=HoldingId,date=date});
}
归还丢失的股份;
}

受saj答案启发的纯Linq查询:

var missingHoldingsList =
 from h in holdings.GroupBy( h => h.HoldingId )
 from d in dateRange.Except( h.Select(x => x.date) ) 
 orderby h.Key, d
 select new Holding { date = d , HoldingId = h.Key };
以及saj答案的无回路版本:

var missingHoldingsDict = (
  from h in holdings.GroupBy(h => h.HoldingId)
  select new
  {
    key = h.Key,
    holdings = 
      from d in dateRange.Except(h.Select(x => x.date))
      select new Holding { date = d, HoldingId = h.Key }
  }
).ToDictionary(
  h => h.key,
  h => h.holdings.ToList()
);

受saj答案启发的纯Linq查询:

var missingHoldingsList =
 from h in holdings.GroupBy( h => h.HoldingId )
 from d in dateRange.Except( h.Select(x => x.date) ) 
 orderby h.Key, d
 select new Holding { date = d , HoldingId = h.Key };
以及saj答案的无回路版本:

var missingHoldingsDict = (
  from h in holdings.GroupBy(h => h.HoldingId)
  select new
  {
    key = h.Key,
    holdings = 
      from d in dateRange.Except(h.Select(x => x.date))
      select new Holding { date = d, HoldingId = h.Key }
  }
).ToDictionary(
  h => h.key,
  h => h.holdings.ToList()
);

你的问题是什么?据我所知,您需要能够生成该范围内缺少的持股列表,而您已经这样做了。这是我的问题,但我还没有解决它!你的问题是什么?据我所知,您需要能够生成该范围内缺少的持股列表,而您已经这样做了。这是我的问题,但我还没有解决它!啊,这就是我的设想,但我就是无法正确地实现。谢谢saj:)啊,这就是我的设想,但我就是无法正确实施。谢谢saj:)