转(Check Null Before Adding into list)

http://codereview.stackexchange.com/questions/3290/check-null-before-adding-into-list
Is there anyway to refactor this ?

 public IEnumerable<Option> Options
    {
        get
        {
            {
                List<Option> ListOption = new List<Option>();

                if (!String.IsNullOrEmpty(Option1)) 
                {
                    ListOption.Add(new Option() {Name=Option1 });
                }
                if (!String.IsNullOrEmpty(Option2))
                {
                    ListOption.Add(new Option() { Name = Option2 });
                }
                if (!String.IsNullOrEmpty(Option3))
                {
                    ListOption.Add(new Option() { Name = Option3 });
                }
                if (!String.IsNullOrEmpty(Option4))
                {
                    ListOption.Add(new Option() { Name = Option4 });
                } 

                return ListOption;
            }
        }
    }

    public class Option
    {
        public string Name { get; set; }
    }

  

==>

//This is a bit neater:
List<Option> ListOption = new List<Option> { };
Action add = x => { if (!String.IsNullOrEmpty(x)) ListOption.Add(new Option { Name = x }); }
add(Option1);
add(Option2);
add(Option3);
add(Option4);
return ListOption;

//This is perhaps even better:
return (new string[] {Option1, Option2, Option3, Option4})
       .Where(x => !String.IsNullOrEmpty(x))
       .Select(x => new Option { Name = x })
       .ToList();

//here's a version using a standard looping mechanism
static List<Option> GetNonNullOptions(params string[] options)
{
    var results = new List<Option>();
    if (options != null)
    {
        foreach (var option in options)
        {
            if (option != null)
            {
                results.Add(new Option { Name = option });
            }
        }
    }
    return results;
}

//Leaving you to do something like this:
var nonNullOptions = GetNonNullOptions(Option1, Option2, Option3, Option4);
//Notice that I only check for null value items, as an empty string and a null value are two different things.

//This is a good opportunity to use the yield operator:
public IEnumerable<Option> Options
{
    get
    {
        if (!string.IsNullOrEmpty(Option1)) yield return new Option{Name=Option1};
        if (!string.IsNullOrEmpty(Option2)) yield return new Option{Name=Option2};
        if (!string.IsNullOrEmpty(Option3)) yield return new Option{Name=Option3};
        if (!string.IsNullOrEmpty(Option4)) yield return new Option{Name=Option4};
    }
}

  

posted @ 2014-04-21 16:02  楊柳  阅读(195)  评论(0编辑  收藏  举报