4

私はこのようなXMLを持っています:

<PrayerTime
    Day ="1" 
    Month="5" 
    Fajr="07:00" 
    Sunrise="09:00"
    Zuhr="14:00"
/>

このようなクラス:

public class PrayerTime
{   
    public string Fajr { get; set; }
    public string Sunrise { get; set; }
    public string Zuhr { get; set; }
}

そして、このような値を取得するための何か:

XDocument loadedCustomData = XDocument.Load("WimPrayerTime.xml");
var filteredData = from c in loadedCustomData.Descendants("PrayerTime")
                   where c.Attribute("Day").Value == myDay.Day.ToString()
                   && c.Attribute("Moth").Value == myDay.Month.ToString()
                   select new PrayerTime()
                   {
                       Fajr = c.Attribute("Fajr").Value,
                       Sunrise = c.Attribute("Sunrise").Value,
                   };
myTextBox.Text = filteredData.First().Fajr;

現在の時刻に基づいて、時間がFajrの値とSunriseの値の間にある場合、myTextBoxはFajrの値を表示する必要があるとどのように言うことができますか。現在の時刻の値が日の出とZuhrの間にある場合、Zuhrを表示しますか?

myTextBox2に属性名を表示するにはどうすればよいですか?たとえば、myTextBoxは値「07:00」を示し、myTextBox2は「Fajr」を示しますか?

4

3 に答える 3

1

まず、@abatischcevに従ってクラスを変更します

public class PrayerTime
{
    public TimeSpan Fajr { get; set; }
    public TimeSpan Sunrise { get; set; }
    public TimeSpan Zuhr { get; set; }
}

次に、linqクエリの選択部分を次のように変更します。

select new PrayerTime()
{
    Fajr = TimeSpan.Parse(c.Attribute("Fajr").Value),
    Sunrise = TimeSpan.Parse(c.Attribute("Sunrise").Value),
    Zuhr = TimeSpan.Parse(c.Attribute("Zuhr").Value)
};

次に、チェックは次のようになります。

var obj = filteredData.First();
TimeSpan currentTime = myDay.TimeOfDay;
string result = String.Empty;
if (currentTime >= obj.Fajr && currentTime < obj.Sunrise)
{
    result = "Fajar";
}
else if (currentTime >= obj.Sunrise && currentTime < obj.Zuhr)
{
    result = "Zuhar";
}
textbox1.Text = result;

(ちなみに、Zuhrの時間はZuhrとAsarの間にあるはずです:))

于 2012-05-07T17:16:37.577 に答える
1

まず、文字列ではなく TimeSpan オブジェクトを保持します。

public TimeSpan Fajr { get; set; }
public TimeSpan Sunrise { get; set; }

これを行うには、XML を DateTime に解析します。

TimeSpan ts = TimeSpan.Parse(c.Attribute("attr"));

そう:

TimeSpan now = DateTime.Now.TimeOfDay; // time part only
var data = filteredData.First();

string result = null;
if (data.Fajr <= now && now < data.Sunrise); // notice operators greed
    result = data.Fajr;
else if (data.Sunrise <= now && now <= data.Zuhr)
    result = data.Zuhr;
myTextBox.Text = result;
于 2012-05-07T16:49:13.627 に答える
0

ここでの問題は、コードが「文字列型」であるということです。DateTimeなどの時間のデザインであるタイプを使用する方が良いでしょうが、それをすばやく修正するには:

               // don't you need a third one here?
               select new PrayerTime()
               {
                   Fajr = c.Attribute("Fajr").Value,
                   Sunrise = c.Attribute("Sunrise").Value,
               };

火は現在の時間を取得します:

int currentHour = DateTime.Now.Hour;

次に、2つの整数の単純な比較です。

var data = filteredData.First();
int fajrHour = int.Parse(data.Fajr.Substring(0, 2), CultureInfo.InvariantCulture);
int sunriseHour = int.Parse(data.Sunrise.Substring(0, 2), CultureInfo.InvariantCulture);
int zuhrHour = int.Parse(data.Zuhr.Substring(0, 2), CultureInfo.InvariantCulture);

if(fajrHour <= currenHour && currenHour < sunriseHour)
{
    myTextBox.Text = data.Fajr; // or to show value fajrHour.ToString()
}
if(sunriseHour <= currenHour && currenHour  < zuhrHour)
{
    myTextBox.Text = data.Zuhr; //    zuhrHour.ToString()
}
// don't you need a third one here?
于 2012-05-07T17:15:19.513 に答える