Отображение по DateTime.now - Silverlight WP7 - PullRequest
1 голос
/ 19 июля 2011

Хорошо, я хочу отобразить некоторые атрибуты, но только если они имеют время начала текущей даты.

Есть ли способ использовать подстановочный знак для значения? или перечислить несколько значений в предложении Where?

Вот пример. Я подумал, могу ли я вывести текущее время и затем преобразовать его в строку (var time = DateTime.Now.ToString ("yyyyMMddHHmmss");) Я мог бы использовать этот var в качестве фильтра для приписывать. здесь ... где tv.Attribute ("начало"). Значение == время

РЕДАКТИРОВАТЬ **

Я обновил код, чтобы немного прояснить, что мне нужно. Как вы можете видеть ниже, я использую предложение Where для отображения атрибутов, связанных с определенным временем «начала».

Теперь этот пример не будет работать для меня, потому что сначала это должны быть все списки за 24-часовой период, а не конкретное время, как показано ниже, а также потому, что я хочу динамически отображать списки по DateTime.Now.

Итак, мне действительно нужен способ отобразить текущий день, а не конкретное время как логическое значение, и использовать его в моем логическом уравнении для отображения атрибутов «start» по текущему дню.

            WebClient c = new WebClient();
            c.DownloadStringCompleted += new DownloadStringCompletedEventHandler(c_DownloadStringCompleted);
            c.DownloadStringAsync(new Uri("http://www.domain.com/source.xml"));
            progressBar1.IsIndeterminate = true;
            progressBar1.Visibility = Visibility.Visible;


        } 


        void c_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
                return;


            var r = XDocument.Parse(e.Result);


            listBox2.ItemsSource = from tv in r.Root.Descendants("programme")
                                   where tv.Attribute("start").Value == "20110724190000 +1200"
                                   let channelE1 = tv.Attribute("channel")
                                   let startE1 = tv.Attribute("start")
                                   let nameEl = tv.Element("title")
                                   orderby tv.Attribute("start").Value ascending
                                   let urlEl = tv.Element("desc")


                                   select new TV1guide



                                   {
                                       DisplayName = nameEl == null ? null : nameEl.Value,
                                       ChannelName = channelE1 == null ? null : channelE1.Value,
                                       ChannelURL = urlEl == null ? null : urlEl.Value,
                                       StartTime = startE1 == null ? (DateTime?)null : DateTime.ParseExact(startE1.Value, "yyyyMMddHHmmss zzz", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AssumeLocal),



                                   };

            progressBar1.IsIndeterminate = false;
            progressBar1.Visibility = Visibility.Collapsed;

public class TV1guide
        {
            public string DisplayName { get; set; }
            public string ChannelURL { get; set; }
            public string ImageSource { get; set; }
            public DateTime? StartTime { get; set; }
            public DateTime? EndTime { get; set; }
            public string ChannelName { get; set; }

        }

    }

}

Кроме того, я также попробовал то, что предложил HiTech Magic, но я уверен, что синтаксис неправильный.

                WebClient c = new WebClient();
                c.DownloadStringCompleted += new DownloadStringCompletedEventHandler(c_DownloadStringCompleted);
                c.DownloadStringAsync(new Uri("http://www.domain.com/source.xml"));
                progressBar1.IsIndeterminate = true;
                progressBar1.Visibility = Visibility.Visible;


            } 

bool MyDateCheckingMethod( DateTime otherDate )
{
    // Is this today (ignoring time)?
    return otherDate.Date == DateTime.Now.Date;
}

void c_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                if (e.Error != null)
                    return;


                var r = XDocument.Parse(e.Result);


                listBox2.ItemsSource = from tv in r.Root.Descendants("programme")
                                       where MyDateCheckingMethod(tv.Attribute("start").Value)
                                       let channelE1 = tv.Attribute("channel")
                                       let startE1 = tv.Attribute("start")
                                       let nameEl = tv.Element("title")
                                       orderby tv.Attribute("start").Value ascending
                                       let urlEl = tv.Element("desc")


                                       select new TV1guide



                                       {
                                           DisplayName = nameEl == null ? null : nameEl.Value,
                                           ChannelName = channelE1 == null ? null : channelE1.Value,
                                           ChannelURL = urlEl == null ? null : urlEl.Value,
                                           StartTime = startE1 == null ? (DateTime?)null : DateTime.ParseExact(startE1.Value, "yyyyMMddHHmmss zzz", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AssumeLocal),



                                       };

                progressBar1.IsIndeterminate = false;
                progressBar1.Visibility = Visibility.Collapsed;

    public class TV1guide
            {
                public string DisplayName { get; set; }
                public string ChannelURL { get; set; }
                public string ImageSource { get; set; }
                public DateTime? StartTime { get; set; }
                public DateTime? EndTime { get; set; }
                public string ChannelName { get; set; }

            }

        }

    }

1 Ответ

3 голосов
/ 19 июля 2011

LINQ хорошо работает со всеми функциями C #, поэтому он может быть простым:

where MyListOfDates.Contains(tv.Attribute("start").Value)

и просто поместите все необходимые даты в List<DateTime> MyListOfDates

Если вы хотите использовать какое-то другое сравнение, а не просто базовый список, поместите логику в метод и назовите его, например ::

where MyDateCheckingMethod(tv.Attribute("start").Value)

Значение «Дата / Время», полученное при разборе XML, на самом деле представляет собой строку в формате «yyyyMMddHHmmss K», поэтому ваш метод может выглядеть следующим образом:

bool MyDateCheckingMethod(string dateString)
{
    DateTime otherDate = DateTime.ParseExact(dateString, "yyyyMMddHHmmss K", null);
    // Is this today (ignoring time)?
    return otherDate.Date == DateTime.Now.Date;
}
...