正在从自定义集合创建逗号分隔的字符串
本文关键字:分隔 字符串 创建 自定义 集合 | 更新日期: 2023-09-27 18:28:04
我有List<Accrual>
和List<Brand>
(以及许多其他类似的对象),如下所述。我需要使用String.Join
从List<string>
创建一个逗号分隔的字符串
public static string GetCommaSeparatedString(List<string> input)
{
return String.Join(",", input);
}
- 在
List<Accrual>
的情况下,我需要将List<Description>
传递给方法 - 在
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);