'a & amp; birlikte ihtiyaç duyarsanız, en fazla 5 Func'ı aynı IEnumerable'a uygulamak için iyi bir yol bulmaya çalışıyorum. Ben ancak, aslında sadece sonuncusu (DepartmentFilter) uygulayarak oluyor o sonuçlarından görebilirsiniz, bir kümülatif şekilde bu başvuruda düşünüyorduBelirsiz sayıda Func <TEntity, bool>
private Func<SurveyUserView,bool> _getFilterLambda(IDictionary<string, string> filters)
{
Func<SurveyUserView, bool> invokeList = delegate(SurveyUserView surveyUserView)
{
return surveyUserView.deleted != "deleted";
};
if (filters.ContainsKey("RegionFilter"))
{
invokeList += delegate(SurveyUserView surveyUserView)
{
return surveyUserView.Region == filters["RegionFilter"];
};
}
if (filters.ContainsKey("LanguageFilter"))
{
invokeList += delegate(SurveyUserView surveyUserView)
{
return surveyUserView.Locale == filters["LanguageFilter"];
};
}
if (filters.ContainsKey("StatusFilter"))
{
invokeList += delegate(SurveyUserView surveyUserView)
{
return surveyUserView.Status == filters["StatusFilter"];
};
}
if (filters.ContainsKey("DepartmentFilter"))
{
invokeList += delegate(SurveyUserView surveyUserView)
{
return surveyUserView.department == filters["DepartmentFilter"];
};
}
return invokeList;
}
: İşte ile geldi budur.
2^4 olası kombinasyon var, bu yüzden/elses çalışmayacaksa kaba kuvvet. (Sadece belirli bir lambda'yı sadece ilgili anahtar sözlüğünde bulunduğunda kullanmak istiyorum.)
DÜZENLEME: DÜZENLENEN çözümdür, ancak değerlendirildiğinde StackOverflowException neden olur. Nedenini gören var mı?
private Func<SurveyUserView,bool> _getFilterLambda(IDictionary<string, string> filters)
{
Func<SurveyUserView, bool> resultFilter = (suv) => suv.deleted != "deleted";
if (filters.ContainsKey("RegionFilter"))
{
Func<SurveyUserView, bool> newFilter =
(suv) => resultFilter(suv) && suv.Region == filters["RegionFilter"];
resultFilter = newFilter;
}
if (filters.ContainsKey("LanguageFilter"))
{
Func<SurveyUserView, bool> newFilter =
(suv) => resultFilter(suv) && suv.Locale == filters["LanguageFilter"];
resultFilter = newFilter;
}
if (filters.ContainsKey("StatusFilter"))
{
Func<SurveyUserView, bool> newFilter =
(suv) => resultFilter(suv) && suv.Status == filters["StatusFilter"];
resultFilter = newFilter;
}
if (filters.ContainsKey("DepartmentFilter"))
{
Func<SurveyUserView, bool> newFilter =
(suv) => resultFilter(suv) && suv.department == filters["DepartmentFilter"];
resultFilter = newFilter;
}
return resultFilter;
}
DÜZENLEME: İşte bu arkadaştan bir StackOverflowException sonuçlandı ve sonsuz özyinelemeler neden oluştuğu anlamak açısından Chris Flather-
önemli şey mentorluk neden çok güzel bir açıklama anlamak olduğunu olduğunda sembolleri içinde Bir lambda çözülür (örneğin çalışma zamanında ve tanımda değil).
Bu basitleştirilmiş bir örneği ele alalım: Aynı şekilde bu tanımlamadaki statik olarak çözümlenmiş olsaydıFunc<int, int> demo = (x) => x * 2;
Func<int, int> demo2 = (y) => demo(y) + 1;
demo = demo2;
int count = demo(1);
bu çalışacak ve olmayacak:
Func<int, int> demo2 = (y) => (y * 2) + 1;
Int count = demo2(1);
Ama aslında anlamaya çalışmaz neyi demo2'de bulunan demo, çalışma zamanına kadar çalışır - demo2, demo olarak yeniden tanımlanır. Esasen kod artık okur:
Func<int, int> demo2 = (y) => demo2(y) + 1;
Int count = demo2(1);
UYARI! Bu, onu uygularken yığın taşması özel durumuna neden oldu. (Bu bir çeşit ironiktir.)) Reed'in çözümü mantıklı bir mantıklıdır, ancak altta yaptığı yorum (cümlelerin nerede olduğu) zincirinin buraya gitmenin tek yolu gibi görünüyor. –
@TreyCarroll Bunu yeni lambda için geçici bir değişken kullanarak yukarıdakiyle aynı şekilde uyguladınız mı? –
Evet. Deseni tam olarak takip ettim. Sadece bu SOE atıyor yeniden onayladı. –