循环列表和字典的高效且更好的方法

时间:2016-08-24 17:49:20

标签: c# list dictionary

我有以下TestDataDto。

  1. public class TestDataDto
    {
       public int ProgramId { get; set; }
       public string ProgramName { get; set; }
       public bool IsEnable { get; set; }
    }
    
  2. 没有设置IsEnable的TestDataDto列表

    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;
    
  4. 现在,我必须根据enableTestData字典中相应的程序ID设置testDatas项的IsEnable属性。

    我可以这样做。

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

    但似乎不是有效的方式,或者说代码看起来并不好:-(。有人可以指导一下这将是最好的方法吗?

    此致

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

或安全的方式:

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

与@MarcinJuraszek相同的O(n)答案,但可能是更短的代码。