【发布时间】:2021-10-19 14:21:27
【问题描述】:
我有一些数据存储在字典中,其中的值基本上是一个对象列表,其中几乎没有属性。现在我正在循环如下以获取存储在特定属性中的数据。然后将这些数据添加到下拉列表中(unity 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 还很陌生,因此我不确定在搜索建议时是否使用了正确的关键字,但到目前为止,我在找到任何有用的建议方面并没有取得太大的成功。
谢谢
【问题讨论】:
-
回答这个问题的最佳方法是,将其发布到Code review
-
LINQ 是一个很好的工具来过滤或选择集合,而不是消耗结果查询。您的代码仅显示您如何使用已有的结果。所以没有什么可以用 LINQ 优化的。换句话说,LINQ 可以帮助构建该字典,但它不能替代
foreach循环。 -
为什么要迭代字典
TeamValuePair?键不能重复,因此if中的代码实际上只执行一次(如果键存在)......您可以直接使用给定键的字典索引器获取列表(假设键存在) -
不要循环字典,而是尝试
TeamValuePair.TryGetValue(teamNames.options[teamNames.value].text, out var list)来获取您需要的单个列表,或者如果没有该键的条目,那么它将返回 false,您可以跳过它 -
LINQ 非常适合编写紧凑、富有表现力的查询。但它依赖于有一些开销的抽象。因此,如果性能是一个问题,它很少是最好的选择。而且一般来说,可读性通常很难与优化相结合,如果没有非常详细的 cmets,高度优化的代码几乎是无法理解的。