【发布时间】:2021-08-16 13:40:44
【问题描述】:
我想将一些值放入字典中:
// Pretend these values are retrieved from a database or something
string firstName = "John";
string lastName = "Smith";
List<string> listHobbies = new List<string> () {"hockey","soccer"};
var dict = new Dictionary<string, dynamic>()
{
{"firstName", firstName},
{"lastName", lastName},
{"hobbies", listHobbies}
};
但是,在某些情况下,List<string> 变量可能是一个空列表。如果是这种情况,我不想将 {"hobbies", listHobbies} 键添加到结果字典中。
有没有办法在字典的集合初始化器中实现这个检查?还是我使用 if 语句检查列表的大小并在声明后立即删除键?
编辑: 本质上,我想知道 C# 是否允许这样的事情:
var dict = new Dictionary<string, dynamic>()
{
{"firstName", firstName},
{"lastName", lastName},
{"hobbies", listHobbies} unless (listHobbies.Count == 0) // don't add the "hobbies" key if the list is empty.
};
我目前可以通过执行以下操作来实现:
var dict = new Dictionary<string, dynamic>()
{
{"firstName", firstName},
{"lastName", lastName},
{"hobbies", listHobbies}
};
}.Concat(listHobbies != 0 ? new Dictionary<string, dynamic>() { { "hobbies", listHobbies } } : new Dictionary<string, dynamic>()).ToDictionary(k => k.Key, v => v.Value);
但这太丑了。
编辑 2: 我找到了一个可以接受的解决方案,如果其他人可以提供更好看的替代方案,请随时提出建议:
var dict = new Dictionary<string, dynamic>()
{
{"firstName", firstName},
{"lastName", lastName},
{"hobbies", !listHobbies.Any() ? listHobbies : null}
}
.Where(entry => entry.Value != null)
.ToDictionary(k => k.Key, v => v.Value);
【问题讨论】:
-
检查 if (listHobbies.Count() > 0) 怎么样
-
是的,我可以在 Dictionary 声明之前或之后检查该条件并相应地删除(或只是不添加)密钥,但是我正在寻找一种在字典初始化中执行此操作的方法干净的代码。
-
我觉得在集合初始化器中放置条件可能是不好的做法。当我们确定值时,我们使用集合初始化器,在其他情况下,运行带条件的循环可能更可取。 Where(x=>x!=null) 将导致整个集合再次迭代以进行空检查。
-
我的感觉是你不需要字典
。您需要一个具有 3 个属性的对象:firstName、lastName 和 hobbies。然后,您可以将此对象填充到 Dictionary 或其他集合中。 -
您在 Edit2 中提出的解决方案是一个很好的解决方案。它清楚地表明您希望从初始收集开始并过滤掉不良项目。
标签: c# dictionary