2015-11-04 52 views
1

另一个问题非常相似,my previous questionLINQ的 - 获取从字典中的所有键,其中在值列表中的所有值都等于标准

的样本数据如下所示...

enter image description here

public class Data 
{ 
    public int Key  { get; set; } 
    public DateTime? Date1 { get; set; } 
    public DateTime? Date2 { get; set; } 
    public DateTime? Date3 { get; set; } 
} 
Data[] table = 
      { 
       new Data { 
         Key = 1234, 
         Date1 = new DateTime(2015, 08, 24), 
         Date2= new DateTime(2015, 08, 24), 
         Date3= null 
        }, 
       new Data 
        { 
         Key = 2134, 
         Date1 = null, 
         Date2 = new DateTime(2015, 08, 24), 
         Date3 = null 
        }, 
       new Data 
       { 
        Key = 2134, 
        Date1 = new DateTime(2015, 08, 24), 
        Date2 = null, 
        Date3 = null 
       }, 
       new Data{ 
        Key = 2345, 
        Date1 = null, 
        Date2 = null, 
        Date3 = new DateTime(2015, 08, 24) 
       }, 
       new Data{ 
        Key = 3451, 
        Date1 = new DateTime(2015, 08, 23), 
        Date2 = null, 
        Date3 = new DateTime(2015, 08, 24) 
       } 
      }; 
var myDateValue = new DateTime(2015, 08, 24); 

当我搜索一个特定的日期,比如说2015-08-24,我只想得到所有对应于这个键的日期等于这个特定日期的键。

对于上面的日期搜索,我想得到1234,2134和2345,但不是3451,因为与键3451对应的列表值中的日期不相同。

我试图沿着线的东西...

var dict = table 
    .Select(row => new {row.Key, Dates = new[] {row.Date1, row.Date2, row.Date3}}) 
    .Where(r => r.Dates.All(d => d.HasValue && d.Value == myDateValue)) 
    .SelectMany(row => row.Dates.Select(d => new {row.Key, Date=d})) 
    .GroupBy(row => row.Key) 
    .ToDictionary(g => g.Key, g => g.Select(r => r.Date).ToList()); 

它不工作:-(

形成字典字典...

Key  Value 
1234 List<DateTime> {2015-08-24, 2015-08-24} 
2134 List<DateTime> {2015-08-24, 2015-08-24} 
2345 List<DateTime> {2015-08-24} 
3451 List<DateTime> {2015-08-23, 2015-08-24} 

,并只选择/输出键1234,2134和2345,因为与3451对应的列表中的所有日期不是相同的日期值

让我clarfiy进一步...

var myDictionary = new Dictionary<int, List<DateTimeOffset?>> 
    { 
     {1234, new List<DateTimeOffset?> {new DateTimeOffset(DateTime.Today), null, new DateTimeOffset(DateTime.Today)}}, 
     {2134, new List<DateTimeOffset?> {null, new DateTimeOffset(DateTime.Today), new DateTimeOffset(DateTime.Today)}}, 
     {2345, new List<DateTimeOffset?> {null, null, new DateTimeOffset(DateTime.Today)}}, 
     {3451, new List<DateTimeOffset?> {new DateTimeOffset(DateTime.Today).AddDays(-1), null, new DateTimeOffset(DateTime.Today)}} 
    }; 

如果我用的DateTimeOffset(DateTime.Today)搜索,我只需要选择或提取键1234,2134和2345,而不是最后一个,因为不是所有的值这个键等于搜索到的datetimeoffset值。

任何帮助,非常感谢。

+0

您能否澄清问题和/或代码示例。我的意思是预期的结果,在这种情况下生成字典是没有意义的(因为Value将始终包含带有MyDateValue的List),所以结果应该只是键?或者没有MyDateValue参数? –

回答

0

谢谢你们伙计们。感谢您的时间。

我的其他问题之一的答案回答了这个问题。如果我查询从我以前的查询中获得的字典输出,我将得到我的结果如下...

var keys = 
    myDictionary 
     .Where(kvp => kvp.Value.All(d => 
      d.HasValue == false || d.Value == new DateTimeOffset(DateTime.Today))) 
     .Select(kvp => kvp.Key); 
3

看起来像你错过了空检查。另外,如果Key是唯一的,则可以删除SelectManyGroupBy。生成的代码看起来可能是这样:

var dict = MyQuery 
    .Select(row => new {row.Key, Dates = new[] {row.Date1, row.Date2, row.Date3}}) 
    .Where(r => r.Dates.All(d => d.Date == MyDateValue || d.Date == null)) 
    .ToDictionary(r => r.Key, r => r.Dates.ToList()); 
0

让把你前面的问题的(IMO)正确的答案,但查询,字典创建部分分开:

var query = data 
    .Select(r => new { r.Key, Dates = new[] { r.Date1, r.Date2, r.Date3 } }) 
    .SelectMany(e => e.Dates.Where(d => d != null), (e, d) => new { e.Key, Date = d.Value }) 
    .GroupBy(e => e.Key, (key, dates) => new { Key = key, Dates = dates.Select(d => d.Date).Distinct().ToList() }); 
var result = query.ToDictionary(e => e.Key, e => e.Dates); 

现在,只得到有同一个日期的物品,你可以简单地插入字典创建部分之前以下

query = query.Where(e => e.Dates.Count == 1); 

,或只是一个特定的日期

query = query.Where(e => e.Dates.Count == 1 && e.Dates[0] == myDateValue); 

当然,所有这些都可以嵌入到单个Linq语句中,我已经将它们分开以提供点。

相关问题