我有以下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;
}
}
}
但似乎不是有效的方式,或者说代码看起来并不好:-(。有人可以指导一下这将是最好的方法吗?
此致
答案 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)答案,但可能是更短的代码。