1

我一直在我的代码中写出几个不同的地方,我想创建一个单一的通用函数,但我不太清楚如何。

这是我正在做的一个例子:

public static string FormatCompaniesAsCSV(ICollection<Company> companies)
{
    string csv = "";
    foreach(Company c in companies)
    {
        csv += c.CompanyName + ",";
    }

    return csv.Substring(0, csv.LastIndexOf(","));
}

问题是,如果我想显示所有公司 SKU 或制造该产品的所有工厂,我必须编写基本相同的代码。唯一改变的是对象类型和我正在访问的属性。我想做的是如下所示:

public static string FormatCSV<T>(ICollection<T> elements, string propertyName)
{
    string csv = "";
    foreach(T element in elements)
    {
        //I know this next line doesn't work
        //this is just a high level conceptualization of what I want to do
        csv += element.getPropertyValue(propertyName) + ","; 
    }

    return csv.Substring(0, csv.LastIndexOf(","));
}

我需要一些方法来访问 foreach 循环中元素的属性,但我真的不知道从哪里开始。我已经简要地查看了 System.Linq.Expressions 库,但我并没有找到我想要的东西。

我在正确的轨道上吗?如果没有,有没有更好的方法来完成我想做的事情?

4

2 回答 2

4

我建议你传递一个代表:

public static string FormatAsCSV<T>(IEnumerable<T> elements,
                                    Func<T, string> converter) 
{ 
    string csv = ""; 
    foreach(T element in elements) 
    { 
        csv += converter(element) + ","; 
    } 

    return csv.Substring(0, csv.LastIndexOf(",")); 
} 

你可以像这样调用这个方法:

FormatAsCsv(companies, x => x.CompanyName);
FormatAsCsv(factories, x => x.ZipCode + " " + x.City);

您甚至可以通过this在第一个参数的类型之前添加来创建扩展方法:

public static string FormatAsCSV<T>(this IEnumerable<T> elements,
                                    Func<T, string> converter) 

现在你可以这样称呼它:

companies.FormatAsCsv(x => x.CompanyName);
factories.FormatAsCsv(x => x.ZipCode + " " + x.City);

顺便说一句:我将类型从 更改ICollection<T>IEnumerable<T>因为您只使用IEnumerable<T>.

您可以改进 CSV 字符串的生成:

public static string FormatAsCSV<T>(this IEnumerable<T> elements,
                                        Func<T, string> converter) 
{
    return elements.Select(x => converter(x)).Aggregate((x, y) => x + "," + y);
}
于 2012-08-15T13:16:23.663 回答
0

带逗号的 concat 可以在 1 行中完成:

List<string> list = new List<string>() { "Hi", "Old" };
string line = String.Join(",", list.ToArray());

你也可以写一个扩展方法(像这样)

public static string SuperJoin(string joinCharacter, IEnumerable<string> strings)
{
    return String.Join(",", strings.ToArray());
}

然后使用 Linq 从对象中选择要组合的字段。无需代表

于 2012-08-15T13:58:09.920 回答