使用LINQ将所有属性连接成字符串

5

I have a class like this:

public class MyClass
{
    public int Line;
    public string Name1;
    public string Name2;
}

以及一个MyClass对象的集合:

List<MyClass> myObjs = myService.GetObjects();

myObjs有2个元素时:

[0]: Line: 1, Name1: "Test1", Name2: "Test2"
[1]: Line: 2, Name1: "Test3", Name2: "Test4"

我想获取每个对象及其属性的字符串拼接,如下所示:

"1,Test1,Test2;2,Test3,Test4"

我尝试使用string.Join(",", myObjs.Select(x => x.Line));,但这只会给我一个包含所有Line值的列表。我需要对象中的所有内容。
3个回答

14

如果手动列出字段是可以的:

String.Join(";", myObjs.Select(x => $"{x.Line},{x.Name1},{x.Name2}"))

如果不是,但所有字段都不是集合、泛型或索引器

var fields = typeof(MyClass).GetFields();
var result = String.Join(";", myObjs.Select(x => 
                 String.Join(",", fields.Select(f => f.GetValue(x)))
             ));

注意:如果你的类实际上有属性而不是字段,你应该使用 GetProperties() 而不是 GetFields()


最后一种选择,如果重写你的类的 ToString() 方法是可行的:

 public override string ToString() => $"{Line},{Name1},{Name2}";

转换这样对象的列表看起来将是这样

 String.Join(";", myObjs)

1
这将以逗号分隔的方式获取您对象的字段:
myObjs.Select( x =>
              String.Join( ",", new [] { x.Line.ToString(), x.Name1, x.Name2 } ));

这里是完整答案,将每个对象用分号分隔,并使用上面的代码:
var result = string.Join(";", myObjs.Select( x =>
                  String.Join( ",", new [] { x.Line.ToString(), x.Name1, x.Name2 } )
             ));

0

如果有人需要,这是更通用的列表方式,

    private string GetConcatedString<T>(List<T> listItems, char delimiter) 
    {  
        var fields = Type.GetType(listItems.GetType().GetGenericArguments()[0].FullName).GetProperties();
        return string.Join("", listItems.Select(x =>
                         string.Join(delimiter, fields.Select(f => f.GetValue(x))).TrimEnd(delimiter)));
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接