制作一个功能而不是两个

Making one function instead of two

我有两个功能:

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;
}    

我重命名了函数、项目和属性以使事情变得更简单。我想做的是一个功能,可能更简单——而不是这两个。如何实现?

属性1 和 属性 2 都是字符串属性。

代码:

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);

使用 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);

你真的需要这样的方法吗:

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

property2 相同,你就完成了