vikil chandrapati Ответов: 2

Как мне проанализировать массив для конкретного значения и выполнить задачу


I've created my own class for a book and need to analyze the array for whether or not it contain true or false and then add 5 to anything that contains true. This is the class
```
 class Book
    {
        public double Price { get; set; }
        public string BookName { get; set; }
        public bool Hardcover { get; set; }

        public Book(string bookname, bool hardcover, double price)
        {
            Price = price;
            BookName = bookname;
            Hardcover = hardcover;
        }
        public override string ToString()
        {
            if (Hardcover == true)
            {
                return BookName + Price + Hardcover;
            }
            else
            {
                return BookName + Price + Hardcover;
            }

        }
```
thx for the help


Что я уже пробовал:

Мое текущее решение-использовать linq, но оно все еще не сработало, я также попробовал string compare
```  public Form1()
        {
            InitializeComponent();
        }
        List<Book> MyBooks = new List<Book>(); 
        private void Form1_Load(object sender, EventArgs e)
        {
            MyBooks.Add(new Book("Book 1", false, 5.50));
            MyBooks.Add(new Book("Book 2", false, 5.50));
            MyBooks.Add(new Book("Book 3", false, 5.50));
            MyBooks.Add(new Book("Book 4", false, 5.50));
            MyBooks.Add(new Book("Book 5", true, 5.50));
        }
        private void Grid_Click(object sender, EventArgs e)
        {
            Button c = (Button)sender;

            List<Book> MyBooks = new List<Book>();

            IEnumerable<String> bookQuery =
                from book in MyBooks
                where book is true
                select book;

            foreach (String p in MyBooks)
            {
                textBox1.Text = textBox1.Text + p.ToString() + Environment.NewLine;
            }
        }
```

2 Ответов

Рейтинг:
20

F-ES Sitecore

List<Book> MyBooks = new List<Book>();

            IEnumerable<String> bookQuery =
                from book in MyBooks
                where book is true
                select book;


Вы создаете новый пустой список, а затем выбираете из него, так что вы никогда не получите никаких результатов, поскольку он пуст. "MyBooks" выше отличается от "MyBooks", которые вы определили на уровне класса, который вы добавили для загрузки. Поскольку нужные вам MyBooks уже определены и заполнены, просто используйте эту версию.

private void Grid_Click(object sender, EventArgs e)
        {
            Button c = (Button)sender;

            IEnumerable<String> bookQuery =
                from book in MyBooks
                where book is true
                select book;


Когда вы делаете код, подобный приведенному выше, он использует MyBooks на уровне класса, но в вашем исходном коде вы создали второй MyBooks на уровне Grid_Click, это концепция, известная как переменная область видимости.

Также не используйте "двойную" по ценам, использовать "десятичная". Double - это аппроксимация вашего числа и может привести к странным вычислительным ошибкам, которых вы не ожидаете, которые могут быть катастрофическими при работе с деньгами. Использование десятичной дроби гарантирует точность всех ваших значений и вычислений.


vikil chandrapati

я не могу использовать десятичные числа потому что по какой то причине я не могу вводить десятичные числа

Рейтинг:
2

OriginalGriff

Чтобы добавить к тому, что сказал F-ES Sitecore:
1) Ваш запрос в настоящее время является избыточным в любом случае, так как вы игнорируете результаты:

IEnumerable<String> bookQuery =
    from book in MyBooks
    where book is true
    select book;

foreach (String p in MyBooks)
{
    textBox1.Text = textBox1.Text + p.ToString() + Environment.NewLine;
}
Вероятно, вам нужно изменить цикл на этот:
foreach (String p in bookQuery)
который использует результаты, а не входные данные.

2) не объединяйте строки - это становится очень неэффективным довольно быстро. Помните, что строки неизменяемы, а это значит, что они не могут быть изменены после создания. Поэтому каждый раз, когда вы добавляете еще немного текста в строку, вы создаете новую строку, достаточно большую для обоих "битов текста". Вместо этого используйте StringBuilder. Вам также не нужно преобразовывать строку в строку ... когда-либо.
StringBuilder sb = new StringBuilder();
foreach (String p in MyBooks)
{
    sb.AppendLine(p);
}
textBox1.Text = sb.ToString();