Concatenate< T> (List< T>列表,字符串指定propertyoft)
本文关键字:字符串 propertyoft 列表 List Concatenate | 更新日期: 2023-09-27 18:12:30
从参数到属性?
public class ConcatenateListTMember
{
public static void Test()
{
var someList = new List<AnyClass>();
someList.Add(new AnyClass("value1"));
someList.Add(new AnyClass("value2"));
Console.WriteLine(Concatenate(someList, "SomeProperty"));
Console.ReadLine();
}
static string Concatenate<T>(List<T> list, string specifiedPropertyOfT)
{
string output = String.Empty;
// TODO: Somehow concatenate all the specified property elements in the list?
return output;
}
}
internal class AnyClass
{
public AnyClass(string someProperty)
{
SomeProperty = someProperty;
}
public string SomeProperty { get; set; }
}
如何在这个代码示例中实现泛型方法?
- 请注意,如果使用其他类型可以实现相同的目标,则
specifiedPropertyOfT
不必是字符串。 - 理想情况下,不需要反射:)
我想你正在寻找。net 4中string.Join
的新重载,它将允许:
IEnumerable<AnyClass> sequence = ...;
string joined = string.Join(",", sequence.Select(x => x.SomeProperty));
如果你不能使用lambda表达式来表达属性——例如,因为这必须在执行时完成——那么你将必须使用反射。
请注意,Select
中的选择器不必返回字符串- String.Join
将调用ToString
对任何非字符串值。
更好的扩展方法:
static string Concatenate<T>(this IEnumerable<T> list, Func<T,string> func)
{
return String.Join("",list.Select(func));
}
用法:
someList.Concatenate(i => i.SomeProperty);
实例:http://rextester.com/runcode?code=LRA78268
试试这样做。我在IEnumerable上创建了一个扩展方法:
public static class Extension
{
public static string ConcatinateString<T>(this IEnumerable<T> collection, Func<T, string> GetValue)
{
StringBuilder sb = new StringBuilder();
foreach (var item in collection)
{
sb.Append(GetValue(item));
}
return sb.ToString();
}
}
然后调用它,你可以这样写:
var values = new List<TestClass>
{
new TestClass(){Name="John",Comment="Hello"},
new TestClass(){Name="Smith", Comment="Word"}
};
string s = values.ConcatinateString((x => x.Name));
string v = values.ConcatinateString((x => x.Comment));
在本例中s = "JohnSmith"
和v = "HelloWord"
。Func()为您提供了灵活性。你基本上是在告诉函数去哪里获取要连接的字符串。我还使用了StringBuilder,以防您正在处理长集合。