2015-06-26 3 views
0

У меня возникла проблема с проверкой правильности списка. У меня есть следующий список:Проверьте, совпадают ли два списка с другим типом

List<RequestDetailViewModel> requestDetail 

что RequestDetailViewModel является:

public int PropertiesValueID { get; set; } 
public int UnitID { get; set; } 
public string Value { get; set; } 
public int PropertyID { get; set; } 

и у меня есть еще один список "reqList":

var reqList = (from p in db.RequestDetail 
         group new 
         { p.PropertyID, p.UnitID , p.Value , p.PropertiesValueID } 
         by p.RequestID into reqG 
         select reqG 
         ); 

я хочу, чтобы проверить список равенства, как это:

foreach (var item in reqList) 
{ 

     if (requestDetail equals item) 

     { 
      return true; 
     } 
} 

Как я могу это решить?

+0

Вы можете реализовать 'IComparable' для вашего класса, а затем использовать' метод SequenceEqual'. Кроме того, вам не нужно создавать группировку анонимного типа, а ваш тип аргумента 'reqList' должен быть' RequestDetailViewModel'. –

+0

Ваш 'reqList' был бы лучше, не создавая анонимный тип, а вместо этого просто группируя запросы, тогда вам должно быть намного проще. – Sayse

+0

Почему вы создаете анонимный тип? Вы используете все свойства, поэтому вы можете сгруппировать их в объект того же типа. –

ответ

2

Изменить ваш reqList выберите:

var reqList = (from p in db.RequestDetail 
         group new 
      { p.PropertyID, p.UnitID , p.Value , p.PropertiesValueID } 
       by p.RequestID into reqG 
       select new RequestDetailViewModel{ 
        PropertyID = reqG.PropertyID, UnitID = reqG.UnitID , 
        Value = reqG.Value , 
        PropertiesValueID = reqG.PropertiesValueID 
       }); 

Вернется List<RequestDetailViewModel>

Реализовать IComparable для RequestDetailViewModel класса используйте SequenceEqual для сравнения двух списков

+0

Вы не можете получить PropertyID, UnitID, Value, PropertiesValueID из reqG, как это! – mohammadrezamajd

0

Почему вы не рамочную список Просмотр модели , linq-запрос списка доменов для каждого элемента. Что-то вроде:

foreach (var detail in requestDetail) 
{ 
    var reqListEqualItems = (from p in db.RequestDetail 
          where p.PropertyID == details.PropertyID && 
            p.UnitID == details.UnitID && 
            p.Value == details.Value && 
            p.PropertyID == details.PropertyID); 
} 

Что-то вроде этого должно указывать объекты объекта Domain для каждого элемента ViewModel.

0

Я бы обновить RequestDetailViewModel следующим образом:

public class RequestDetailViewModel : INotifyPropertyChanged 
{ 
    private ResultDetail resultDetail; 

    public RequestDetailViewModel(ResultDetail resultDetail) 
    { 
    this.resultDetail = resultDetail; 
    } 

    public ResultDetail 
    { 
    get 
    { 
     return this.resultDetail; 
    } 
    } 

    public int PropertiesValueID 
    { 
    get 
    { 
    return this.resultDetail.PropertiesValueID; 
    } 
    set 
    { 
     this.resultDetail.PropertiesValueID = value; 
     this.RaisePropertyChanged("PropertiesValueID"); 
    } 
    } 

    public int UnitID 
    { 
    get 
    { 
     return this.resultDetail.UnitID ; 
    } 
    set 
    { 
     this.resultDetail.UnitID = value; 
     this.RaisePropertyChanged("UnitID"); 
    } 
    } 

    public string Value 
    { 
    get 
    { 
     return this.resultDetail.Value; 
    } 
    set 
    { 
     this.resultDetail.Value= value; 
     this.RaisePropertyChanged("Value"); 
    } 
    } 

    public int PropertyID 
    { 
    get 
    { 
     return this.resultDetail.PropertyID ; 
    } 
    set 
    { 
     this.resultDetail.PropertyID = value; 
     this.RaisePropertyChanged("PropertyID"); 
    } 
    }  
} 

Я бы также реализовать IEquatable в модели БД. и я сделаю чек, как это:

foreach (var item in reqList) 
{ 
    if (requestDetail.ResultDetail.Equals(item)) 
    { 
     return true; 
    } 
} 

или еще лучше

return reqList.Any(item=> item.Equals(requestDetail.ResultDetail)); 
Смежные вопросы