2013-12-09 64 views
1

當前,此代碼將搜索所有組,並返回一個CameraItem,其中uniqueID等於某個值。返回一個組,其中一個項目的值等於

我想要發生的事情是我想要代碼返回CameraItem的組(CameraGroup)。

public static async Task<CameraItem> GetItemAsync(string uniqueId) 
{ 
    await _sampleDataSource.GetSampleDataAsync(); 
    // Simple linear search is acceptable for small data sets 
    var matches = _sampleDataSource.Groups.SelectMany(group => group.Items).Where((item) => item.Id.Equals(uniqueId)); 
    if (matches.Count() == 1) return matches.First(); 
    return null; 
} 

我在返回CameraGroup嘗試:

public static async Task<CameraGroup> GetItemGroupAsync(string uniqueId) 
{ 
    await _sampleDataSource.GetSampleDataAsync(); 
    // Simple linear search is acceptable for small data sets 
    var matches = _sampleDataSource.Groups.SelectMany(group => group.Items).Where((item) => item.Id.Equals(uniqueId)); 
    if (matches.Count() == 1) 
    { 
     // Something here? 
     // Would it be a modification of var matches? 
    } 

    return null; 
} 

我將需要修改返回CameraItem的CameraGroup什麼

返回CameraItem的代碼?

回答

2

這裏,matches將包含有至少一個項目匹配uniqueId所有組:

static async Task<CameraGroup> GetItemGroupAsync(string uniqueId) 
{ 
    await _sampleDataSource.GetSampleDataAsync(); 

    var matches = _sampleDataSource.Groups 
     .Where(group => group.Items.Any(item => item.Id.Equals(uniqueId))); 

    return matches.Count() == 1 ? matches.First() : null; 
} 

您可以考慮使用FirstOrDefault()SingleOrDefault()像這樣,而不是Count() == 1檢查 - 使得它乾淨了一點,我認爲:

static async Task<CameraGroup> GetItemGroupAsync(string uniqueId) 
{ 
    await _sampleDataSource.GetSampleDataAsync(); 

    return _sampleDataSource.Groups 
     .SingleOrDefault(group => 
         group.Items.Any(item => item.Id.Equals(uniqueId))); 
} 
+0

謝謝!這工作,但我需要用Items.FirstorDefault替換Items.Any - 是否有Items.Any的原因? – ForeverLearning

+0

@ForeverLearning:如果您使用上面的代碼,這有點奇怪。如果任何項目的謂詞(即lambda)爲真,則任何'返回true。它的關鍵是返回一個布爾值,這是'Where'之後的值。另一方面'FirstOrDefault'返回物品的一個實例,可能是一個'CameraItem'。除非您將它與您的知道項目進行比較,否則這不應該被接受。在這種情況下,如果該組不具有該項目作爲其第一項,則可能會出現問題。 – Chris

+0

對不起,更正,我的意思是Groups.Where。我將其改爲FirstOrDefault,因爲我得到了一個明確的轉換錯誤 – ForeverLearning

相關問題