c# - 建议以更好的方式优化以下代码
问题描述
我有一些数据存储在字典中,其中的值基本上是一个对象列表,其中几乎没有属性。现在我正在循环如下以获取存储在特定属性中的数据。然后将这些数据添加到下拉列表中(统一 UI 下拉列表)
foreach (KeyValuePair<string, List<NameIDValuePair>> kvp in TeamValuePair)
{
List<NameIDValuePair> list = kvp.Value;
if(kvp.Key == teamNames.options[teamNames.value].text)
{
foreach (var rec in list)
{
screenNamesDropDown.options.Add(new TMP_Dropdown.OptionData { text = rec.ScreenName });
}
}
}
teamNames 和 screenNamesDropDown 是我的统一 UI 的下拉元素。
NameIdValuePair 的结构如下所示:
public class NameIdValuePair
{
public string ScreenName { get; private set; }
public string ScreenId { get; private set; }
}
我想使用 linq 以更好的方式优化这段代码 - 使其更具可读性。由于我对 linq 很陌生,因此我不确定在搜索建议时是否使用了正确的关键字,但到目前为止,我在找到任何有用的建议方面并没有取得太大的成功。
谢谢
解决方案
如前所述,而不是循环 a Dictionary
- 我们已经知道键是唯一的 - 您可以简单地使用Dictionary.TryGetValue
// do this only once!
var key = teamNames.options[teamNames.value].text;
if (TeamValuePair.TryGetValue(key, out var list))
{
foreach(var item in list)
{
screenNamesDropDown.options.Add(new TMP_Dropdown.OptionData(item.ScreenName));
}
}
然后实际上,如果你真的想的话,你可以使用 Linq 的唯一地方可能是在
var key = teamNames.options[teamNames.value].text;
if (TeamValuePair.TryGetValue(key, out var list))
{
screenNamesDropDown.options.AddRange(list.Select(item => new TMP_Dropdown.OptionData(item.ScreenName)));
}
如果这使它更好地阅读是有问题的。
一般来说,问题还在于您是否总是想要Add
( AddRange
)screenNamesDropDown.options
或者您是否可能想要实际替换选项。然后AddRange
你可以做
screenNamesDropDown.options = list.Select(item => new TMP_Dropdown.OptionData(item.ScreenName)).ToList();
推荐阅读
- javascript - 如何在异常捕获中获取数据库引用?
- botframework - Microsoft 团队免费帐户:此卡操作已禁用,因为 BOT 已被您的管理员阻止
- windows - 如何执行 ubuntu.exe 并使用一个命令导航到直接文件夹?
- google-cloud-platform - 在 GCP 上调整永久磁盘大小时,如何触发文件系统调整大小?
- ruby-on-rails - Rails:如何删除默认版本的捆绑程序?
- java - 声纳的 Spring Boot 配置问题
- python - 数组用零填充
- reactjs - 如何根据用户登录凭据重定向到反应应用程序中的不同页面?就像所有用户都有相同的页面和
- r - 使用 rvest 下载 Kaggle 数据集
- excel - 以 .xls 格式保存表格以替代 docmd.sendObject acSendTable