在这种情况下,如何通过使用lambda或linq避免使用嵌套的foreach语句?

时间:2012-11-24 12:29:34

标签: c# asp.net-mvc-3 linq

如何在此方案中使用lambda或linq避免使用嵌套的foreach语句?它已经很晚了,我似乎无法弄清楚如何访问ErrorMessage属性而不必恢复到嵌套的foreach语句。如果使用完全Lambda或Linq重写代码,那么等效方法是什么?

public static List<String> ExtractErrors(this ModelStateDictionary modelStateDictionary)
        {
            List<String> errors = new List<String>();

            var modelErrorCollection = (from modelState in modelStateDictionary.Values
                                        where modelState.Errors != null && modelState.Errors.Count > 0
                                        select modelState.Errors).ToList();

            foreach (var item in modelErrorCollection)
            {
                foreach (ModelError modelError in item)
                {
                    errors.Add(modelError.ErrorMessage);
                }
            }

            return errors;
        }

2 个答案:

答案 0 :(得分:4)

您希望SelectMany用于此

    public static List<String> ExtractErrors(this ModelStateDictionary modelStateDictionary)
    {
        var modelErrorCollection = (from modelState in modelStateDictionary.Values
                                    where modelState.Errors != null && modelState.Errors.Count > 0
                                    select modelState.Errors)
                                    .SelectMany(item=>item)
                                    .Select(modelError=>modelError.ErrorMessage)
                                    .ToList();
         return modelErrorCollection;
     }

答案 1 :(得分:0)

不是errors.Add(modelErrorCollection.SelectMany(x => x))吗?