【问题标题】:storing lists that can be edited in a loop?存储可以循环编辑的列表?
【发布时间】:2013-12-31 09:15:06
【问题描述】:
我想在我拥有的列表中获取字符串并将它们转换为适当的枚举。使用 enum.parse 的代码可以做到这一点。我的代码的问题是它在离开循环后不存储 dispoFilters 。解决这个问题的好方法是什么?
// Get Disposition enum
if (model.FilterSet.Dispositions != null)
{
List<int> dispoFilters = new List<int>();
for (int i = 0; i < model.FilterSet.Dispositions.Count; i++)
{
dispoFilters.Add((int)((RespondentStatus)Enum.Parse(typeof(RespondentStatus), model.FilterSet.Dispositions[i].ToString())));
}
}
【问题讨论】:
标签:
c#
asp.net-mvc
for-loop
enums
【解决方案1】:
离开 IF 语句后,您的代码不会存储 dispoFilters。
将你的声明上移一点。
List<int> dispoFilters = new List<int>();
if (model.FilterSet.Dispositions != null)
{
for (int i = 0; i < model.FilterSet.Dispositions.Count; i++)
{
dispoFilters.Add((int)((RespondentStatus)Enum.Parse(typeof(RespondentStatus), model.FilterSet.Dispositions[i].ToString())));
}
}
Scope 是一个术语,用于定义变量在多长时间和代码的哪些部分可用。通过在 if 语句中声明变量,您在退出 if 时失去了作用域。
【解决方案2】:
那是因为您在 if 块内定义了 dispoFilters 并且它在它之外将不可用。因此,根据您的需要将其定义在if 之外或上层scope。另请注意,并不是它在循环外不可用(正如您所提到的),它将在循环外可用,但在您的 if 条件内可用。
List<int> dispoFilters = new List<int>();
if (model.FilterSet.Dispositions != null)
{
for (int i = 0; i < model.FilterSet.Dispositions.Count; i++)
{
dispoFilters.Add((int)((RespondentStatus)Enum.Parse(typeof(RespondentStatus), model.FilterSet.Dispositions[i].ToString())));
}
}
根据您的代码:
if (model.FilterSet.Dispositions != null)
{
List<int> dispoFilters = new List<int>();
for (int i = 0; i < model.FilterSet.Dispositions.Count; i++)
{
dispoFilters.Add((int)((RespondentStatus)Enum.Parse(typeof(RespondentStatus), model.FilterSet.Dispositions[i].ToString())));
}
//With in the if condition outside the loop you can still access dispoFilters
}
【解决方案3】:
其他答案是正确的,但您甚至不必使用 for 循环。以下是您可以执行的操作:
var dispoFilters = model.FilterSet.Dispositions.ConvertAll(item =>
(int)((RespondentStatus)Enum.Parse(typeof(RespondentStatus), item.ToString())));
我认为model.FilterSet.Dispositions 是List;如果没有,您必须在ConvertAll 之前使用toList()。