2016-01-16 6 views
2

Im пытается сравнить 2 списка типа Результаты, и он постоянно просто возвращает весь список результатов, он, кажется, ничего не фильтрует.List.Except метод возвращает неправильные результаты

Это код:

List<Results> Veranderingen = resultaten2.Except(resultaten).ToList(); 

     foreach(Results x in Veranderingen) 
     { 
      MessageBox.Show("Nieuwe Data gevonden: " + x.titel + "Van de website" + x.url + ""); 
     } 

код, где списки заполняется это (менее важно):

private void Lijst2invullen() 
    { 

     OleDbConnection connection = new OleDbConnection(); 
     connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\martijn\Dropbox\Proftaak Periode 2 Identity\Database11.accdb; 
     Persist Security Info=False;"; 
     connection.Open(); 

     OleDbCommand cmd2 = new OleDbCommand(); 
     cmd2.Connection = connection; 
     cmd2.CommandText = "SELECT ZoekcriteriaID from Zoekcriteria WHERE ZoekCriteria = '" + Convert.ToString(cbzoektermselecteren.Text) + "';"; 
     OleDbDataReader reader2 = cmd2.ExecuteReader(); 

     if (reader2.Read()) 
     { 
      refreshid2 = Convert.ToInt32(reader2["ZoekcriteriaID"]); 
     } 




     OleDbCommand command5 = new OleDbCommand(); 
     command5.Connection = connection; 
     command5.CommandText = "SELECT Titel, Webadress from Resultaat WHERE ZoekcriteriaID = " + refreshid2 + ";"; 
     OleDbDataReader reader3 = command5.ExecuteReader(); 

     while (reader3.Read()) 
     { 
      Results result = new Results(); 
      result.url = Convert.ToString(reader3["Webadress"]); 
      result.titel = Convert.ToString(reader3["Titel"]); 

      resultaten2.Add(result); 
     } 
     reader3.Close(); 
     label1.Text = "Ziet er goed uit!"; 
    } 

    private void Lijst1invullen() 
    { 
     OleDbConnection connection = new OleDbConnection(); 
     connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\martijn\Dropbox\Proftaak Periode 2 Identity\Database11.accdb; 
     Persist Security Info=False;"; 
     connection.Open(); 


     OleDbCommand cmd1 = new OleDbCommand(); 
     cmd1.Connection = connection; 
     cmd1.CommandText = "SELECT ZoekcriteriaID from Zoekcriteria WHERE ZoekCriteria = '" + Convert.ToString(cbzoektermselecteren.Text) + "';"; 
     OleDbDataReader reader1 = cmd1.ExecuteReader(); 

     if (reader1.Read()) 
     { 
      refreshid = Convert.ToInt32(reader1["ZoekcriteriaID"]); 
     } 


     OleDbCommand command = new OleDbCommand(); 
     command.Connection = connection; 
     command.CommandText = "SELECT Titel, Webadress from Resultaat WHERE ZoekcriteriaID = " + refreshid + ";"; 
     OleDbDataReader reader = command.ExecuteReader(); 



     while (reader.Read()) 
     { 
      Results result = new Results(); 
      result.url = Convert.ToString(reader["Webadress"]); 
      result.titel = Convert.ToString(reader["Titel"]); 

      resultaten.Add(result); 
     } 
     reader.Close(); 
     reader1.Close(); 

     OleDbCommand command2 = new OleDbCommand(); 
     command2.Connection = connection; 
     command2.CommandText = "DELETE * FROM Resultaat WHERE ZoekcriteriaID = " + refreshid + ";"; 
     command2.ExecuteNonQuery(); 

     OleDbCommand command3 = new OleDbCommand(); 
     command3.Connection = connection; 
     command3.CommandText = "DELETE * FROM Zoekcriteria WHERE ZoekCriteriaID = " + refreshid + ";"; 
     command3.ExecuteNonQuery(); 

     search.zoekterm = cbzoektermselecteren.Text; 
     search.InsertZoekcriteria(); 
     search.searchding(); 

    } 

Я думаю, что я делаю что-то неправильно в синтаксисом Кроме того, кто-нибудь может мне помочь?

+0

Можете ли вы показать ' Класс результатов? Определяет ли он 'Equals' и' GetHashCode'? –

+0

Класс Results - это не что иное, как класс с двумя свойствами для хранения данных, я не знаю, что делают Equals и GetHashCode, поэтому я не определяю их в классе. –

+0

Если ни один из элементов resultaten2 также не находится в результате, тогда метод Except вернет все содержимое resultaten2. –

ответ

4

Есть два способа сравнения (равенство) два Results объектов (и все объекты, ссылки типа в целом):

  • Первый способ заключается в сравнении значений свойств двух Results объектов ,

  • Второй способ - сравнить сами ссылки. И под этим я подразумеваю, что два объекта Results равны, если они фактически являются одним объектом, но у вас есть две ссылки на него. Например, вы можете создать один объект Results и поместить его в два списка.

Объекты в двух списках - это разные объекты, поэтому я предполагаю, что вы хотите использовать первый способ сравнения.

По умолчанию проверка равенства объектов ссылочного типа в C# относится ко второму типу. Однако вы можете переопределить это поведение, если хотите.

Одним из способов переопределения этого поведения является переопределение методов Equals и GetHashCode в классе. Вот пример:

public class Results 
{ 
    public string url { get; set; } 
    public string title { get; set; } 

    public override bool Equals(object obj) 
    { 
     Results other = obj as Results; 

     if (other == null) 
      return false; 

     return other.url == this.url && other.title == this.title; 
    } 

    public override int GetHashCode() 
    { 
     return new {url, title}.GetHashCode(); 
    } 
} 

Таким образом мы сообщаем системе, как он должен проверять равенство для объектов этого типа.

+0

Большое вам спасибо! Он показывает только те элементы, которые отличаются друг от друга двумя значениями, которые я хотел :) –

1

Я уверен, что ответ Якуба будет работать и, вероятно, является предпочтительным решением в большинстве случаев, но если вы не можете изменить класс Results, вот еще один способ сделать это. Определите реализацию IEqualityComparer для результатов, а затем передайте ее как второй аргумент метода Except. EDIT:

class Results { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

class ResultsEqualityComparer : IEqualityComparer<Results> { 

    public bool Equals(Results res1, Results res2) { 
     return (res1.FirstName == res2.FirstName && res1.LastName == res2.LastName); 
    } 

    public int GetHashCode(Results res) { 
     return new { res.FirstName, res.LastName }.GetHashCode(); 
    } 

} 

// и вот пример кода, передавая ResultsComparer к за исключением:

 var resultaten = new List<Results>() { 
     new Results() {FirstName="Bob", LastName="Smith"}, 
     new Results() {FirstName="Ted", LastName="Wilson"}, 
     new Results() {FirstName="Alice", LastName="Wilson"}, 
     new Results() {FirstName="Carol", LastName="Smith"} 
     }; 

     var resultaten2 = new List<Results>() { 
     new Results() {FirstName="William", LastName="Smith"}, 
     new Results() {FirstName="Ted", LastName="Wilson"}, 
     new Results() {FirstName="Gerhardt", LastName="Wilson"}, 
     new Results() {FirstName="Carol", LastName="Smith"} 
     }; 

     var comparer = new ResultsEqualityComparer(); 

     List<Results> Veranderingen = resultaten2.Except(resultaten, comparer).ToList(); 

     foreach (var x in Veranderingen) { 
      Console.WriteLine(x.FirstName + " " + x.LastName); 
     } 

// печатает: William Smith Герхардт Wilson

+0

Ответы Да Якуба работали, Но спасибо за вашу помощь, я собираюсь попробовать это завтра только для тестирования, так как это может пригодиться позже! Спасибо большое –

+0

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