在 C# 中为变量名添加数字
Posted
技术标签:
【中文标题】在 C# 中为变量名添加数字【英文标题】:Adding a number to variable names in C# 【发布时间】:2013-06-06 20:59:49 【问题描述】:我的问题有点像这里的问题: How do I name variables dynamically in C#? 但是它有点不同,所以我想知道它是否可能。
我正在尝试从 .settings 文件中读取一堆字符串。 我将它们都命名为 Time1、Time2、Time3 等... 我希望用户能够向文件中添加更多时间,以便可能有 Time100 或更多。 我在设置文件中有一个大小,它将跟踪时间变量的数量。 我想写一些能读入所有时间字符串的东西。我认为用 100 个时间变量预先填充 .settings 文件会很愚蠢,所以我知道它们在那里,然后手动读取每个变量。 所以我想知道是否有一种方法可以让我在 Timei 或 Time+i 中读取,其中我是一个整数,我可以将其放入一个可以找到所有这些的循环中。 (请注意,数据是字符串而不是时间,它只是要转换为星期几) 如:(天数来自ApplicationSettingsBase [aka file add new Settings1.settings]
public static int AvDaysIndex = Days.Default.Size; //This holds the number of items in Days
public static DayOfWeek[] AvailableDays = new DayOfWeek[AvDaysIndex]; //This is where I wants to read in all the variables Aka Time1 Time2 Times3
public ReadInDays() //Reads in from the .settings File
if(AvDaysIndex>0) // Makes sure there is something in Days to read
int I=0;
//I can Manually do the following
AvailableDays[I++] = Days.Default.Time1;
AvailableDays[I++] = Days.Default.Time2;
AvailableDays[I++] = Days.Default.Time3; //etc...
//Is there a way to do something like this
for (int i = 0; i < AvDaysIndex; i++) //reads in each time
AvailableDays[i] = Days.Default.Time +i;//where I would be added to the variable name to find it?
//Or something like
AvailableDays[i] = Days.Default.Time(I.tostring())
希望所有这些至少能说明我想要做什么。
编辑 - 我开始认为我的问题实际上与 .settings 文件有关。并且如果我只是从另一个没有名称的文件类型中读取值,即使文件中的元素数量可变,我也可以轻松读取它们。
解决方案 -
for (int i = 0; i < Index; i++)
AvailableDays[i] = getFromFile(_Days.Default.Properties["Time" + (i+1).ToString()].DefaultValue.ToString());
AvailableTimes[i] = Convert.ToDateTime(_Times.Default.Properties["Time" + (i + 1).ToString()].DefaultValue);
这一切都是为了弄清楚如何从 .settings 文件中读取,而不是直接读取它,也就是 Days.Default.Time1;我必须从 Days.Default.Properties 进行通用查找,然后我可以创建一个动态名称并找到它。你们可能想告诉我该怎么做,我只是不明白。
再次感谢所有提供帮助的人。
【问题讨论】:
为什么不用字典呢? 我不知道会有多少个 .Time# 。可能有 5 个,可能有 400 个。所以我试图找到一些动态的东西。我想如果我使用一个库,我必须将所有 Times 预编码到一定数量,然后将用户限制为该次数。 (这是一个正确的假设吗) 【参考方案1】:我认为您可以通过使用 ConfigurationElementCollection。那么配置元素的“名称”就无关紧要了。您枚举一组值并直接使用它们。
请看这里的例子; How to implement a ConfigurationSection with a ConfigurationElementCollection.
【讨论】:
我什至不知道 ConfigurationElementCollection。我要去读读它。谢谢你的主意。当我知道更多时回来。【参考方案2】:如前所述,哈希表或字典可能会为您提供最好的服务。如果你走字典路线,你可以在类上创建一个字符串/整数索引器,你可以稍微改变你的代码:
http://msdn.microsoft.com/en-us/library/2549tw02%28v=vs.80%29.aspx - 在类上创建索引器的示例:
示例索引器类:
public class Default
private Dictionary<int, DayOfWeek> _values = new Dictionary<int,DayOfWeek>();
public DayOfWeek this[int index]
get
if (_values.ContainsKey(index))
return _values[index];
else
return null;
set
_values[index] = value;
原文:
AvailableDays[i] = Days.Default.Time(I.tostring())
会变成:
AvailableDays[i] = Days.Default.Time[I];
反射总是一个选项,我在下面有一个示例,它位于 Windows 控制台应用程序中:
public class Default
public int Time1 get; set;
public int Time2 get; set;
public int Time3 get; set;
class Program
static void Main(string[] args)
Default d = new Default();
Type t = d.GetType();
foreach (var info in t.GetProperties())
//SET VALUE
info.SetValue(d, 1);
foreach (var info in t.GetProperties())
//GET VALUE
Console.WriteLine("Property: 0", info.Name);
Console.WriteLine("Value: 0", info.GetValue(d));
//OR JUST ONE PROPERTY
Console.WriteLine("Time1 Property Value: 0", t.GetProperty("Time1").GetValue(d));
Console.ReadLine();//PAUSE THE CONSOLE AFTER PROCESSING
在您使用反射的示例中:
Days.Default.GetType().GetProperty("Time" + I.ToString()).GetValue(Days.Default) as DayOfWeek;
【讨论】:
感谢您的回复,它实际上帮助我弄清楚了我正在努力解决的一些问题,但是它仍然没有回答我要问的问题。 (我可能只是问的不正确,我对 c# 很陌生)这似乎可以让我像我想要的那样读取预定义的东西,我仍然不确定你将如何将它与 .settings 文件一起使用. (也许我应该只制作自己的文件并在那里输出东西,然后一次读取一个,然后名称无关紧要)再次感谢 谢谢!这帮助最大。我想到了! for (int i = 0; i 【参考方案3】:另一种选择是使用Reflection
。并即时从enum
获取值。
查看链接:How to Get Enum Values with Reflection in C#
但是,使用Dictionary<string, DayOfWeek>
会给您带来更好的性能和更易读的代码。
【讨论】:
我不太确定反射将如何使我能够从文件中获取变量,而无需对名称进行硬编码。在我读完它们之后,我知道如何使用反射或字典,这很容易。我的问题更是如此,我猜有没有办法动态读取内容。 (谢谢)【参考方案4】:我会使用哈希表/字典来存储 Days.Default.TimeX
变体
hashtable["Time1"]...hashtable["TimeN"]
【讨论】:
有了哈希表,我不需要提前对所有时间进行预编码吗?如果可能有 400 次,则最多可达 400 次。即使实际上只有4个?我不知道会有多少 .Time# 。可能有 4 次,也可能有 400 次。我想这样做是为了让用户可以拥有尽可能少的 1 次或尽可能多的时间。以上是关于在 C# 中为变量名添加数字的主要内容,如果未能解决你的问题,请参考以下文章