C# 使一个函数代替两个函数

C# 使一个函数代替两个函数,c#,function,generics,refactoring,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

我有两个职能:

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;
}    
公共列表getAllProperties1() { 列表输出=新列表(); foreach(getItems()中的MyItem项) { 如果(!output.Contains)(item.property1)&& item.property1!=空) { 输出。添加(项目。属性1); } } 返回输出; } 公共列表getAllProperties2() { 列表输出=新列表(); foreach(getItems()中的MyItem项) { 如果(!output.Contains)(item.property2)&& item.property2!=null) { 输出。添加(项目。属性2); } } 返回输出; } 我重命名了函数、项和属性,使事情变得更简单。我想做的是一个函数,可能更简单-而不是这两个。如何做到这一点

属性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;
}
代码:


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

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

您真的需要这种方法吗:

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

property2也一样
,您已经完成了

您真的需要实现这一点的方法吗:

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

property2
相同,代码改进属于您。

可能重复的@TimSchmelter此代码已从上下文中删除(使用占位符名称而不是实值),这使其脱离主题成为“示例代码”在CR上。代码改进属于。@TimSchmelter的可能副本此代码已从上下文中删除(使用占位符名称而不是实际值),这使得它在CR上作为“示例代码”脱离主题。