2014-03-22 2 views
0

У меня есть список из 10 элементов, как показано в XML ниже.Выбор определенной 5 строк в списке XML

<books_standing bestsellers="My Book" total="10"> 
    <book book_id="4" book_name="Book 4" copy_sold="41" position="1"/> 
    <book book_id="14" book_name="Book 14" copy_sold="38" position="2"/> 
    <book book_id="23" book_name="Book 23" copy_sold="33" position="3"/> 
    <book book_id="1" book_name="Book 1" copy_sold="30" position="4"/> 
    <book book_id="4" book_name="Book 4" copy_sold="28" position="5"/> 
    <book book_id="25" book_name="Book 25" copy_sold="27" position="6"/> 
    <book book_id="13" book_name="Book 13" copy_sold="24" position="7"/> 
    <book book_id="7" book_name="My Book" copy_sold="20" position="8"/> 
    <book book_id="8" book_name="Book 8" copy_sold="19" position="9"/> 
    <book book_id="2" book_name="Book 2" copy_sold="18" position="10"/> 
</book_standing> 

Что я хочу сделать, это выбрать определенную строку, а затем показать 2 строки сверху и 2 строки ниже. Я хочу показать название книги «Моя книга», которая в настоящее время находится на 8 позиции. Что я хочу показать «Моя книга» между двумя данными выше и ниже. Мой пример - Должность, Название книги & Копия продана.

6 Book 25 27 
7 Book 13 24 
**8 My Book 20** 
9 Book 8 19 
10 Book 2 18 

Я могу извлечь данные, но не уверен, как сосредоточиться на той конкретной книге, в которой я нуждаюсь.

class BookStanding 
    { 
    public int BookId { get; set; } 
    public string BookName { get; set; } 
    public string Position { get; set; } 
    public string CopySold { get; set; } 
    } 

System.Xml.Linq.XDocument _xdoc = System.Xml.Linq.XDocument.Parse(responseAsString); 
var bookData = from books in _xdoc.Descendants("book") 
      select new 
       { 
        book_id = books.Attribute("book_id").Value, 
        book_name = books.Attribute("book_name").Value, 
        position = books.Attribute("position").Value, 
        copy_sold = books.Attribute("copy_sold").Value 
       }; 

      ObservableCollection<BookStanding> MyBookStanding = new ObservableCollection<BookStanding>(); 

      int bookIdx = 0; 
      foreach (var books in bookData.Take(10)) 
      { 
       BookStanding mBookStanding = new BookStanding(); 

       mBookStanding.BookId = Convert.ToInt32(books.book_id); 
       mBookStanding.BookName = books.book_name; 
       mBookStanding.Position = Convert.ToInt32(books.position); 
       mBookStanding.CopySold = Convert.ToInt32(books.won); 

       MyBookStanding.Add(mBookStanding); 

       bookIdx++; 
      } 
      BooksListBox.DataContext = MyBookStanding; 

      BooksGrid.Visibility = System.Windows.Visibility.Visible; 

Спасибо!

Кредиты @Nir Smadar за помощь в этом. Решение дано ему было после того, как петля поместить эти коды.

var BookPosition = MyBookStanding.Single(b => b.Book_Name == "My Book").Position; 
var selectedBooks = MyBookStanding.Where(b => b.Position <= BookPosition + 2 && b.Position >= BookPosition - 2); 

BooksListBox.ItemsSource = MyBookStanding; 
BooksGrid.Visibility = System.Windows.Visibility.Visible; 

ответ

1

После загрузки элементы, которые вы в конечном итоге с коллекцией книг «MyBookStanding». Теперь вам нужно найти позицию выбранной книги: var bookPosition = MyBookStanding.Single (b => b. Book_name == anyBookName) .position;

И, наконец, 5 книг: var selectedBooks = MyBookStanding.Where (b => b.position < = bookPosition + 2 || b.position> = bookposition - 2);

Извините, что не форматировал мой ответ. Я набираю текст из своей ячейки.

+0

Так что я добавляю это право после каждого цикла так? 'var bookPosition = MyBookStanding.Single (b => b.book_name ==" Моя книга "). position; var selectedBooks = MyBookStanding.Where (b => b.position <= bookPosition + 2 || b.position> = bookposition - 2); BooksListBox.DataContext = selectedBooks; ' – Osirus

+0

Да. Это должно сработать. Если да, примите мой ответ. –

+0

Я сделал то, что вы говорите. Но он все еще показывает все 10 книг. Что-то там, где я ошибся? – Osirus

Смежные вопросы