2016-08-24 81 views
0

我有以下TestDataDto。 TestDataDto而不IsEnable循環列表和字典的有效和更好的方法

  1. public class TestDataDto 
    { 
        public int ProgramId { get; set; } 
        public string ProgramName { get; set; } 
        public bool IsEnable { get; set; } 
    } 
    
  2. 列表被設置

    var testDatas = new List<TestDataDto> 
        { 
         new TestDataDto {ProgramId = 1, ProgramName = "Abc"}, 
         new TestDataDto {ProgramId = 2, ProgramName = "xyz"}, 
         new TestDataDto {ProgramId = 3, ProgramName = "jkl"}, 
        }; 
    
  3. 測試數據指定的字典其中節目ID是使

    var enableTestData = new Dictionary<int, bool>(); 
        enableTestData[1] = false; 
        enableTestData[2] = true; 
        enableTestData[3] = true; 
    

現在,我設置IsEnable屬性y根據enableTestData字典中的相應程序ID確定testDatas的項目。

我可以這樣做。

foreach (var b in enableTestData) 
     { 
      foreach (var testDataDto in testDatas) 
      { 
       if (testDataDto.ProgramId == b.Key) 
       { 
        testDataDto.IsEnable = b.Value; 
       } 
      } 
     } 

但似乎並沒有成爲有效的方式或者說代碼不好看:-(。有人可以請指導我什麼將是實現這一目標的最佳方式是什麼?

問候

回答

0
testDatas.ForEach(d => d.IsEnable = enableTestData[d.ProgramId]); 

或安全的方式:

testDatas.ForEach(d => d.IsEnable = enableTestData.ContainsKey(d.ProgramId) && enableTestData[d.ProgramId]); 

同爲O(n)爲@MarcinJuraszek的答案,但也許更短的代碼。

+0

這是上面答案(現已刪除)的痛苦剽竊,與馬辛的回答相比,仍然是非常低效和危險的。 –

+0

+你在做2查找:) – MarcinJuraszek

+0

是的,但正如你所說@MarcinJuraszek他們是O(1)_ [這在技術上是不正確的] _所以我們不在乎。 – serhiyb

8

有一個更好的辦法而不是遍歷整個詞典的使用TryGetValue來檢查,如果你正在尋找的價值存在。

foreach (var testDataDto in testDatas) 
{ 
    bool value; 
    testDatas.TryGetValue(testDataDto.ProgramId, out value); 
    testDataDto.IsEnabled = value; 
} 

因爲查找在Dictionary<TKey, TValue>是一個O(1)操作它將您的O(n * m)方法變爲O(n)