首页 > 解决方案 > 建议以更好的方式优化以下代码

问题描述

我有一些数据存储在字典中,其中的值基本上是一个对象列表,其中几乎没有属性。现在我正在循环如下以获取存储在特定属性中的数据。然后将这些数据添加到下拉列表中(统一 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 很陌生,因此我不确定在搜索建议时是否使用了正确的关键字,但到目前为止,我在找到任何有用的建议方面并没有取得太大的成功。

谢谢

标签: c#linqunity3d

解决方案


如前所述,而不是循环 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();

推荐阅读