2016-12-27 2 views
-1

Здравствуйте, я пытаюсь создать систему фильтров для списка.C# lambda convert

public void filter<T, E>(String fieldName, List<T> list, Func<T, E> rule) 
{ 
    IList<FilterDto> filters = GetFilter(fieldName); 
    foreach (FilterDto filter in filters) 
    { 
     if (filter != null) 
     { 
      if (filter.valueType == ValueType.NUMERIC) 
      { 
       list.Remove(this.filter(fieldName, Convert.ToDouble(o => rule(o)))); 
      } 
      else if (filter.valueType == ValueType.DATE) 
      { 
      } 
      else if (filter.valueType == ValueType.TEXT) 
      {  
      } 
      else 
      { 
       Log("Unkown filter comparsion"); 
      } 
     } 
    } 
} 

На этой линии:

list.Remove(this.filter(fieldName, Convert.ToDouble(o => rule(o)))); 

я получаю сообщение об ошибке:

Error CS1660: Cannot convert lambda expression to type 'bool' because it is not a delegate type 

я должен бы сделать реальную фильтрацию на что-то методы, как, что:

public bool filter(String fieldName, double? value) 
public bool filter(String fieldName, int? value) 
public bool filter(String fieldName, Date? value) 
+1

Что вы 'правило)' метод (? Что он возвращает? –

+0

Редактировать мой вопрос :) – Flo

ответ

-1

Я нашел ошибку ... Я должен использовать RemoveAll.

Как что:

list.RemoveAll(o => this.filter(filter, Convert.ToDouble((rule(o) as Double?)))); 
2

В нижней строке нет перегрузки Convert.ToDouble() принимает выражение лямбда в качестве аргумента. Компилятор в основном выбирает одну из перегрузок - в этом случае тот, который принимает bool, и говорит вам, что он не может преобразовать лямбда в bool.

Вы пытаетесь передать возвращаемое значение с rule() для преобразования? Если это так, просто вызовите rule() себя, и передать это все, что вар вам нужно передать его (неясно, из Вашего вопроса):

list.Remove(this.filter(fieldName, Convert.ToDouble(rule(yourVar)))); 
+0

Я буду в this.filter (fieldName, ...) для каждого элемента в списке. Как я могу это сделать? – Flo

+0

Также «вашVar» должен быть каждым элементом в списке. – Flo

0

Что вы не имеет особого смысла. В вашей комедии (или трагедии - вы выбираете) у вас есть следующие актеры:

  1. IList<FilterDto>, контейнер ваших объектов фильтра.
  2. Метод filter, который держит всех вместе.
  3. A filter Локальная переменная, которая обязана своим существованием (1) и держит недовольство против (2), потому что она имеет то же имя.
  4. Метод Convert.ToDouble, который является частью diva, потому что он не будет просто принимать никого в качестве аргумента своего параметра.
  5. Метод Remove, сын (1).
  6. o => rule(o) лямбда выражения.

Введите IList (1). Вы перебираете его и создаете переменную filter (3). Теперь приходит метод Remove (5), который вы вызываете, возможно, чтобы удалить упомянутый filter (3), который вы фактически не делаете; вместо этого вы удаляете результат filterметод (2), что является неудачным, потому что filter (2) делает не имеет результат (увы это void). Тем не менее, filter (2) хочет получить Func<T, E> в качестве своего второго аргумента (хотя не обязательно то же самое T и E в качестве исходного вызова filter - метод). Входит зло ToDouble (4), которое имеет результат double, что не является Func<T, E> - отсюда и ваша ошибка. Чтобы все ухудшилось, o => rule(o) (6) пробивается в список аргументов ToDouble (4). Текущий рейтинг a Func<T, E>, хотя ToDouble (4) не сможет ничего с ним поделать, потому что, даже если он пытается усердно, он не может преобразовать его в double.

Теперь, как мы разрезаем этот гордиев узел?

Ну, как я вижу, вы можете удалить элемент из IList (1) в случае успешного последующего вызова вашего правила фильтрации. Моя догадка (это должно быть предположение, потому что ваш вопрос не совсем понятно, есть), что вы намерены что-то близкое к этому:

T[] itemsToRemove = list.Where(o => rule(Convert.ToDouble(o))).ToArray(); 
foreach (T item in itemsToRemove) { 
    list.Remove(item); 
} 
+0

Спасибо за помощь! Но я нашел свою ошибку. – Flo