2016-08-24 13 views
0

私は以下のTestDataDtoを持っています。リストと辞書をループする効率的で良い方法

  1. public class TestDataDto 
    { 
        public int ProgramId { get; set; } 
        public string ProgramName { get; set; } 
        public bool IsEnable { get; set; } 
    } 
    
  2. プログラムIDは、私が持っている今

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

を、有効であるテストデータ指定の

var testDatas = new List<TestDataDto> 
    { 
     new TestDataDto {ProgramId = 1, ProgramName = "Abc"}, 
     new TestDataDto {ProgramId = 2, ProgramName = "xyz"}, 
     new TestDataDto {ProgramId = 3, ProgramName = "jkl"}, 
    }; 
  • 辞書を設定されているIsEnableずにTestDataDto一覧IsEnableプロパティを設定する有効なテストデータ辞書内の対応するプログラムIDに応じて、testDatasの項目のy

    このようにすることができます。

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

    しかし、効率的な方法かというコードが良い:-(を見ていないではないようです。誰かがこれをachiveするための最良の方法がどうなるか私を導いてくださいことはできますか?

    よろしく

  • 答えて

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

    または安全な方法:

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

    @MarcinJuraszekの答えと同じO(n)は多分短いコード。

    +0

    これは、(今削除された)上記の答えの痛ましい剽窃であり、Marcinの答えと比較してもまだ悲惨で非効率的で危険です。 –

    +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; 
    } 
    

    ためのルックアップの中でO(n * m)メソッドをO(1)操作に変更すると、O(n)に変更されます。

    関連する問題