2015-07-28 4 views
0

У меня есть две идентичные коллекции: 1, которая передается в представление, а другая, которая хранится в сеансе перед отображением представления.Сравнение двух коллекций с linq и переменной заполнения

Мы используем скрытые поля в представлении, внутри этих скрытых полей находится SenderId. Когда пользователь отправляет страницу, я хочу сравнить предоставленные SenderId с SenderId в коллекции Session и заполнить переменную с идентификаторами, которые не совпадают (что означало бы, что пользователь вмешался в скрытые поля)

Это это то, что я в настоящее время:

var storedValues = (List<MailBox>)Session["Mail"]; 
var noMatch = (from x in model where storedValues.Any(s => s.SenderId != x.SenderId) select x.SenderId).ToList(); 

Но независимо от того, что я делаю это всегда выбирает все из них, даже если я изменю SenderId на представлении и при отладке я вижу SenderId, которые я подделаны, я могу 't для жизни меня получить переменную noMatch для заполнения неправильным SenderId, с которым я вмешался.

Любая помощь будет оценена по достоинству.

Update Декларация модели:

public class MailBox 
{ 
    public Int64 SenderId { get; set; } 

    public Int64 RecipientId { get; set; } 

    public string Username { get; set; } 

    public int TotalMessages { get; set; } 

    public string PhotoId { get; set; } 

    public bool NewMessages { get; set; } 

    public DateTime LastLoggedIn { get; set; } 

    public DateTime LatestEmailDate { get; set; } 

    public bool LoggedIn { get; set; } 

    public string Message { get; set; } 

    public bool Delete { get; set; } 
} 
+0

Я бы попробовать другой синтаксис, как: storedValues.Where (x => x.SenderId! = s.SenderId) –

+0

@SebastianL Я пробовал это, но получаю ошибку: аргумент не присваивается типу параметра bool –

+1

Пожалуйста, покажите, как определяется модель. – Kapol

ответ

0

Если коллекции имеют одинаковый размер, вы можете использовать .zip()

collection1.Zip(colection2, (col1_item, col2_item) => 
{ 
    if(col1_item.SomeProperty == col2_item.SomeProperty) 
    { 
     // 
    } 
}); 
0

мне удалось в настоящее время решить эту проблему, выполнив следующие действия :

var noMatch = model.Where(item => item.Delete && storedValues.Any(x => x.SenderId == item.SenderId)).Select(item => item.SenderId).ToList(); 
0

Используйте следующие GenericListComparer, для типа T, который является MailBox в вашем случае, вам необходимо переопределить метод и Equals. Таким образом, вы можете возвращать различные элементы в любом из двух списков, и возможны многие другие операции.

internal class GenericListComparer<T> 
    { 
internal static IEnumerable<T> FindOnlySecondListElements(IEnumerable<T> firstCollection, 
      IEnumerable<T> secondCollection) 
     { 
      // Create Hashset from first list 
      HashSet<int> firstCollectionHashSet = 
       new HashSet<int>(firstCollection.Select(element => element.GetHashCode())); 

      // Fetch elements only in second type list 
      List<T> onlySecondListElements = 
       secondCollection.Where(element => !firstCollectionHashSet.Contains(element.GetHashCode())).ToList(); 

      return onlySecondListElements; 
     } 
} 

код для переопределения Equals и GetHashCode и Equals в MailBox:

public class MailBox : IEquatable<MailBox> 
    { 
     public Int64 SenderId { get; set; }  

     public bool Equals(MailBox other) 
     { 
      //Check whether the compared object is null. 
      if (Object.ReferenceEquals(other, null)) return false; 

      //Check whether the compared object references the same data. 
      if (Object.ReferenceEquals(this, other)) return true; 

      //Check whether the CustomEntity properties are equal. 
      return SenderId.Equals(other.SenderId); 
     } 

    // If Equals() returns true for a pair of objects 
    // then GetHashCode() must return the same value for these objects. 

    public override int GetHashCode() 
    { 
     // Get hash code for the Id field 
     return SenderId.GetHashCode(); 
     } 

    } 

Множественные поля также могут быть oevrriden проверьте следующее link