好的,所以必须有一个更有效的方法来做到这一点,但我似乎有一点编码器的阻止。
我有一个文本框,允许用户进入城市并确定该城市的时间。我想按时区划分城市。这是我现有的代码可以正常工作:
string stringToCheck = cityBox.Text;
DateTime utc = DateTime.UtcNow;
对于山:
TimeZoneInfo MST = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
DateTime mst = TimeZoneInfo.ConvertTime(utc, MST);
string[] zoneMST = { "denver","calgary","etc" };
foreach (string x in zoneMST)
{
if (x.Contains(stringToCheck))
{
clockLabel.Content = mst.ToString("hh:mm tt");
}
}
和中环:
TimeZoneInfo CST = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cst = TimeZoneInfo.ConvertTime(utc, CST);
string[] zoneCST = { "kansas city","etc", };
foreach (string x in zoneCST)
{
if (x.Contains(stringToCheck))
{
clockLabel.Content = cst.ToString("hh:mm tt");
}
}
问题是我需要做185个城市(这就是我按时区分组的原因)并且有103个时区。
我的问题是,是否有更好的格式化方法可以防止我不得不为每个时区重复此代码?
答案 0 :(得分:4)
您可以构建一个代表时区Dictionary<string,List<string>>
的集合,然后是每个时区的城市:
var timeZoneDictionary = new Dictionary<string, List<string>>
{
{ "Mountain Standard Time", new List<string> { "Denver", "Calgary" } },
{ "Central Standard Time", new List<string> { "Kansas City" } }
};
一旦你拥有了它,你就可以轻松地完成并循环整个事情:
foreach(var kvp in timeZoneDictionary)
{
if(kvp.Value.Any(city => city == stringToCheck))
{
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(kvp.Key);
var time = TimeZoneInfo.ConvertTime(utc, timeZoneInfo);
clockLabel.Content = time.ToString("hh:mm tt");
break;
}
}
答案 1 :(得分:2)
编辑:用户最初将WPF作为标记
WPF示例怎么样?
这个需要更多的工作,但从长远来看它会得到回报。目标是让用户在城市中键入并返回该城市所在的区域到文本块。我们将在Xaml中使用转换器来完成这项工作。
从xaml开始工作的是用户输入和Xaml中的结果
<TextBox Name="UserInputCity" Text="{Binding City, UpdateSourceTrigger=LostFocus}"/>
<TextBlock Text="{Binding City,
Converter={StaticResource ZoneConverter},
NotifyOnSourceUpdated=True}" />
或者屏幕上的第一个控件获取城市的用户输入,并将其绑定到ViewModel上的City
(或当前数据上下文中的INotifyPropertyChanged属性)。以下控件是一个TextBlock控件,它将显示该城市所在的区域,这要归功于使用名为“ZoneConverter”的转换器或后面的代码。
<Window.Resources>
<conv:TimeZoneConverter x:Key="ZoneConverter" />
</Window.Resources>
我们将创建一个我们的转换器将使用的City Class对象。它将保留城市名称和当前时区。请注意我们如何将UTC偏移量作为将来可以使用的枚举:
public class City
{
public enum eZones
{
Central = 5,
Mountain = 6,
}
public string Name { get; set; }
public eZones Zone { get; set; }
};
最后我们的转换器完成了繁重的工作:
public class TimeZoneConverter : System.Windows.Data.IValueConverter
{
public static IList<City> Cities = new List<City>
{
new City() { Name= "chicago", Zone = City.eZones.Central },
new City() { Name= "denver", Zone = City.eZones.Mountain },
new City() { Name= "calgary", Zone = City.eZones.Mountain }
};
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string result = "???";
if ((value != null) && (!string.IsNullOrWhiteSpace(value.ToString() )))
{
var city = Cities.FirstOrDefault(town => town.Name == value.ToString().ToLower());
if (city != null)
result = city.Zone.ToString();
}
return result;
}
public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
当在用户文本输入框中丢失焦点时,用户输入Denver
或denver
Mountain
时会尽职尽责地显示此信息。转换器可以显示实际时间,而不是显示Mountain
,但已经证明了该过程。