У меня есть список из 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;
Так что я добавляю это право после каждого цикла так? '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
Да. Это должно сработать. Если да, примите мой ответ. –
Я сделал то, что вы говорите. Но он все еще показывает все 10 книг. Что-то там, где я ошибся? – Osirus