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

本文关键字:更好 方法 有效 循环 字典 列表 | 更新日期: 2023-09-27 18:03:53

我有下面的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;
    

现在,我必须根据enableTestData字典中相应的程序ID设置testDatas项的IsEnable属性。

我可以这样做。

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

但似乎不是有效的方法,或者更确切地说,代码看起来不好:-(.有人能告诉我什么是实现这一点的最佳方法吗?

问候

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

还有更好的方法。使用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((n(

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

或安全方式:

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

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