2015-11-04 41 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語句中,我已經將它們分開以提供點。

相關問題