制作一个功能而不是两个

时间:2015-05-12 07:35:44

标签: c# function generics refactoring

我有两个功能:

public List<string> getAllProperties1()
{
    List<string> output = new List<string>();
    foreach (MyItem item in getItems())
    {
        if (!output.Contains(item.property1) &&
            item.property1 != null)
        {
            output.Add(item.property1);
        }
    }
    return output;
}

public List<string> getAllProperties2()
{
    List<string> output = new List<string>();
    foreach (MyItem item in getItems())
    {
        if (!output.Contains(item.property2) &&
            item.property2 != null)
        {
            output.Add(item.property2);
        }
    }
    return output;
}    

我重命名了函数,项目和属性,使事情变得更简单。我想要做的是一个功能,可能更简单 - 而不是这两个。怎么做到这一点?

Property1和Property 2都是字符串属性。

3 个答案:

答案 0 :(得分:4)

你真的需要这方法:

List<string> allUniqueProp1 = getItems()
    .Select(x => x.property1)
    .Where(s => s != null)
    .Distinct()
    .ToList();

property2相同,您已完成

答案 1 :(得分:1)

代码:

public List<string> getAllProperties(Func<MyItem, string> func)
{
    List<string> output = new List<string>();
    foreach (MyItem item in getItems())
    {
        string value = func(item);
        if (!output.Contains(value) &&
            value != null)
        {
            output.Add(value);
        }
    }
    return output;
}

用法:

getAllProperties(e => e.property1);

答案 2 :(得分:1)

使用Func作为策略来获取比较属性并从单个方法调用:

public List<string> GetAll(Func<MyItem, string> propertyGetter)
{
    List<string> output = new List<string>();
    foreach (MyItem item in getItems())
    {
        var value = propertyGetter(item);
        if (!output.Contains(value) && value != null)
        {
            output.Add(value);
        }
    }
    return output;
} 

然后使用:

GetAll(item => item.Property1);
GetAll(item => item.Property2);