循环列表和字典的有效且更好的方法
本文关键字:更好 方法 有效 循环 字典 列表 | 更新日期: 2023-09-27 18:03:53
我有下面的TestDataDto。
public class TestDataDto { public int ProgramId { get; set; } public string ProgramName { get; set; } public bool IsEnable { get; set; } }
-
未设置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"}, };
-
指定启用的程序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(,但可能代码更短。