2015-05-30 2 views
-1

Я пытаюсь перечислить ряд строк в соответствии с текстом, введенным пользователем в txtDepartment.Text. Но он отображает все элементы, которые у меня есть не только типа BOOK. ДЕПАРТАМЕНТ - это перечисление и имеет значения типа BOOK, ГАЗЕТА и ЦИФРОВОЙ. Кто-нибудь знает, как я могу отображать только тип BOOK не всех элементов в списках ресурсов? Ниже приведен код, который у меня есть.Перечисления Foreach Loop C#

string searchdep = txtDepartment.Text; 
     foreach(Resource res in resourceslist) 
     { 
      if(searchdep==DEPARTMENT.BOOK) 
      { 
       lbResult.Items.Add(res); 
      } 
     } 

Это мой класс Resouce

namespace OOP_V1._3 
{ 
    public enum DEPARTMENT 
    { 
     BOOK, 
     NEWSPAPER, 
     DIGITAL 
    } 

    public enum STATUS 
    { 
     AVALIABLE, 
     BORROWED, 
     RESERVED 
    } 

    [Serializable] 
    public abstract class Resource : IComparable 
    { 
     public string title; 
     public string refno; 
     public DEPARTMENT department; 
     public STATUS status; 

     public string searchdep { get; set; } 

     public string getTitle() 
     { 
      return title; 
     } 

     public void setTitle(string iTitle) 
     { 
      this.title = iTitle; 
     } 

     public string getRefno() 
     { 
      return refno; 
     } 

     public void setRefno(string iRefno) 
     { 
      this.refno = iRefno; 
     } 

     public DEPARTMENT getDepartment() 
     { 
      return department; 
     } 

     public void setDepartment(DEPARTMENT iDepartment) 
     { 
      this.department = iDepartment; 
     } 

     public STATUS getStatus() 
     { 
      return status; 
     } 

     public void setStatus(STATUS iStatus) 
     { 
      this.status = iStatus; 
     } 

     public override string ToString() //display the books in the form of a string 
     { 
      return String.Format("Ref No: {0}, Title: {1}, Department: {2}, Status: {3}", refno, title, department, status); 
     } 

     public Resource(string refno, string title, string status) 
     { 
      this.refno = refno; 
      this.title = title; 

      if (status == "Available") 
      { 
       this.status = STATUS.AVALIABLE; 
      } 
      else if (status == "Borrowed") 
      { 
       this.status = STATUS.BORROWED; 
      } 
      else if (status == "Reserved") 
      { 
       this.status = STATUS.RESERVED; 
      } 
     } 

     public int CompareTo(Object obj) 
     { 
      Resource other = (Resource)obj; 

      int c = string.Compare(this.getTitle(), other.getTitle()); //comparing the title inputted by the user with a title from the list 

      return c; //returning the answer 
     } 
    } 
} 

ответ

0

я включаю здесь 2 варианта, в зависимости от того, что вы хотите сделать. В обоих случаях результат фильтрации работает:

static void Main(string[] args) 
    { 
     List<Resource> Resources = new List<Resource> { new Resource(DEPARTMENT.DIGITAL), new Resource(DEPARTMENT.BOOK) }; 
     List<Resource> lbResult = new List<Resource>(); 
     string searchdep = "BOOK"; 
     DEPARTMENT result; 
     //if (Enum.TryParse(searchdep, true, out result)) 
      foreach (var res in Resources) 
       if (res.department == DEPARTMENT.BOOK) //or instead == result. 
        lbResult.Add(res); 
     Console.ReadLine(); 
    } 

Я добавил этот небольшой конструктор в коде просто чтобы быть в состоянии проверить выше.

public class Resource : IComparable 
    { 
     public Resource(DEPARTMENT dep) 
     { 
      department = dep; 
     } 
     ... 
    } 

Если это не сработает, вам придется объяснить дальше.

+0

.searchdep не загружается, когда res. написано ... есть ли другой способ, как я могу это сделать? –

+0

В своем ответе я должен угадать, не зная, что такое ваш код. Если вы включили класс Resource, это упростит ситуацию. У вас есть свойство с этим именем в вашем классе? 'public string searchdep {get; задавать; } ' Можете ли вы объяснить немного больше того, что вы пытаетесь сделать? – Guy

+0

Нет. У меня нет этой собственности. Если я добавлю, это сработает? ... –

1

Во-первых, я бы рекомендовал разобрать значение пользователя в вашем Enum, а затем предпринять соответствующие действия, если вход недействителен. Вы можете сделать это с помощью Enum.TryParse метода:

DEPARTMENT result; 
if (!Enum.TryParse(searchdep, true, out result)) 
{ 
    // display error message? 
    return; 
} 

Затем вы можете использовать это разобранное значение для сравнения:

if (result == DEPARTMENT.BOOK) 
{ 
    foreach (Resource res in resourceslist) 
    { 
     lbResult.Items.Add(res); 
    } 
} 

(я перевернул свои if и foreach блоки вокруг, потому что нет никакой необходимости чтобы повторно проверить значение , что foreach цикл.)

+0

Еще не повезло с статусом if.Он возвращает ошибку: Ошибка Оператор '==' не может быть применен к операндам типа 'string' и т. Д. –

+0

@Michael Мой плохой. Ошибка копирования/вставки. Посмотрите, работает ли это сейчас. –

+0

Он получает другие типы, но ... ГАЗЕТЫ И ЦИФРОВЫЕ ... –