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不必是字符串。
  • 理想情况下,不需要反射:)

Concatenate< T> (List< T>列表,字符串指定propertyoft)

我想你正在寻找。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,以防您正在处理长集合。