正在从自定义集合创建逗号分隔的字符串

本文关键字:分隔 字符串 创建 自定义 集合 | 更新日期: 2023-09-27 18:28:04

我有List<Accrual>List<Brand>(以及许多其他类似的对象),如下所述。我需要使用String.JoinList<string>创建一个逗号分隔的字符串

    public static string GetCommaSeparatedString(List<string> input)
    {
        return String.Join(",", input);
    }
  1. List<Accrual>的情况下,我需要将List<Description>传递给方法
  2. List<Brand>的情况下,我需要通过List<Name>方法

我们如何用最少的代码行数以最可读的方式实现它?

注意:我使用的是.Net 4.0

类示例

public class Accrual
{
    public string Code { get; set; }
    public string Description { get; set; }
}
public class Brand
{
    public int Number { get; set; }
    public string Name { get; set; }
}

正在从自定义集合创建逗号分隔的字符串

首先,您可以覆盖ToString方法:

public class Brand
{
    public int Number { get; set; }
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
}
void Method()
{
    var brands = new List<Brand>()
    {
        new Brand { Number = 1, Name = "a" },
        new Brand { Number = 2, Name = "b" }
    };
    // outputs: a,b
    Console.WriteLine(string.Join(",", brands));
}

其次,您可以使用Linq获取名称,然后加入它们:

var brandsNames = brands.Select(i => i.Name);
string joinedNames = string.Join(",", brandsNames);

如果你真的需要通用方法,那么你可以使用这个方法(尽管它没有给你任何东西,至少在这种情况下),它仍然使用overriden ToString方法:

public static class Formatter
{
    public static string GetCommaSeparatedString<T>(IEnumerable<T> input)
    {
        return string.Join(",", input);
    }
}
// and then
string brandsStrings = Formatter.GetCommaSeparatedString<Brand>(brands);
// or just
string brandsStrings = Formatter.GetCommaSeparatedString(brands);

首先,我将GetCommaSeparatedString方法签名更改为支持IEnumerable<string>而不是List<string>,并将其转换为扩展方法:

public static string GetCommaSeparatedString(this IEnumerable<string> input)
{
    return String.Join(",", input);
}

然后简单地做:

var accDescrs = listAccruals.Select(x => x.Description).GetCommaSeparatedString();
var brndNames = listBrands.Select(x => x.Name).GetCommaSeparatedString();
public static string SeparateByCommas<T, TProp>(this IEnumerable<T> source, Expression<Func<T, TProp>> expression)
{
    var memberExpression = expression.Body as MemberExpression;
    if (memberExpression == null)
        return string.Empty;
    var propName = memberExpression.Member.Name;
    return source.Aggregate(new StringBuilder(), (builder, t) =>
           {
               builder.Append(typeof (T).GetProperty(propName).GetValue(t).ToString());
               builder.Append(",");
               return builder;
           }).ToString();
}
var test = new List<Brand>
{
   new Brand
   {
     Number = 1,
     Name = "a"
   },
   new Brand
   {
     Number = 2,
     Name = "b"
   }
};

string separateByCommas = test.SeparateByCommas(brand => brand.Name);