2010-06-21 7 views
2

У меня есть следующий объект:IQueryable .Except() не приводит к тому, что я ожидаю!

Line{ String Content; Type type;} 

И у меня есть, IQeryable<Line> линии, которые я выполнять операции против. Я выбрал некоторые строки, где line.Content.Contains('x') = list1, и теперь пытаюсь добраться до остальных линий т.е. линий - list1 и для этого я использую

list2 = lines.Except(list1); 

но приводит к list2 = lines.

Код:

private 
    IQueryable<Line> 
    ExtractLines(
    IQueryable<Line> allLines, 
    String keyword, 
    ref IQueryable<Line> hits) 
    { 

     hits = allLines.Where(lx => lx.Content.Contains(keyword)); 

     return allLines.Except(hits); 
    } 

какие-либо идеи?

+2

Можете ли вы опубликовать весь код? Это очень грязно, скорее всего, вы что-то пропустили. Это возможно только в том случае, если 'list1' пуст. – Kobi

+0

Ни одна из строк не содержит «x»? –

+0

не очень. list1 имеет +500 позиций :) – OneDeveloper

ответ

1

lines является IQeryable<Line>. Если вы не сохраните его результат, он будет запускаться каждый раз, когда вы выберете его. Если Line не переопределяет Equals и ==, это будет создавать разные объекты каждый раз, поэтому Except не может удалить предыдущий объект из новых объектов.

Теперь, много не хватает, но попробовать:

var linesList = lines.ToList(); // get results ones 
var hasX = lines.Where(line => line.Content.Contains('x')); 
var noX = lines.Except(hasX); 
+1

Я буду отмечать это как ответ, так как у него есть немного объяснений, которые могли бы использовать все остальные. – OneDeveloper

+0

Спасибо. Вчера я удалил его, так как ваше редактирование сделало его неправильным. Простите за это. – Kobi

2

Хорошо. Все, что мне нужно было сделать, это реализовать IEqualityComparer<T> в классе Line.

Смежные вопросы