IQueryable удалить из коллекции, лучший способ? - PullRequest
0 голосов
/ 25 февраля 2010
IQueryable<SomeType> collection = GetCollection();
foreach (var c in collection)
{
    //do some complex checking that can't be embedded in a query
    //based on results from prev line we want to discard the 'c' object
}

//here I only want the results of collection - the discarded objects

Так что с этим простым кодом, каков наилучший способ получить результаты. Должен ли я создать список непосредственно перед foreach и вставить объекты, которые я хочу сохранить, или есть какой-то другой способ, который лучше использовать для этого типа вещей.

Я знаю, что есть другие посты на подобные темы, но я просто не чувствую, что получаю из них то, что мне нужно.

Изменить Я пробовал это

 var collection = GetCollection().Where(s =>
 {
      if (s.property == 1)
      {
           int num= Number(s);
           double avg = Avg(s.x);
           if (num > avg)
               return true;
           else
               return false;
      }
      else return false;
 });

Я пытался это сделать, но мне дали "лямбда-выражение с телом оператора не может быть преобразовано в дерево выражений" при компиляции. Разве я не сделал что-то правильно?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2010
//do some complex checking that can't be embedded in a query

Я не понимаю. Вы можете передать делегат, который может указывать на очень сложную функцию (Turing-complete), которая проверяет, следует ли вам ее отменить или нет:

var result = GetCollection().AsEnumerable().Where(c => { 
  // ...
  // process "c"
  // return true if you want it in the collection
             });

Если вы хотите, вы можете изменить его в другой функции:

var result = GetCollection.Where(FunctionThatChecksToDiscardOrNot);
0 голосов
/ 25 февраля 2010

Если вы заключите его в другой метод, вы можете использовать yield return, а затем выполнить итерацию по возвращенной коллекции, например:

public IEnumerable<SomeType> FindResults(IQueryable<SomeType> collection) {

    foreach (var c in collection)
    {
        if (doComplicatedQuery(c)) {
            yield return c;
        }
    }
}

// elsewhere
foreach (var goodItem in FindResults(GetCollection())) {
   // do stuff.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...