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

not*_*lkk 3 c# linq

我有一个这样的课:

public class MyClass
{
    public int Line;
    public string Name1;
    public string Name2;
}
Run Code Online (Sandbox Code Playgroud)

和MyClass对象的集合:

List<MyClass> myObjs = myService.GetObjects();
Run Code Online (Sandbox Code Playgroud)

哪里myObjs有2个元素:

[0]: Line: 1, Name1: "Test1", Name2: "Test2"
[1]: Line: 2, Name1: "Test3", Name2: "Test4"
Run Code Online (Sandbox Code Playgroud)

我想让每个对象的属性连接在一个字符串中,如:

"1,Test1,Test2;2,Test3,Test4"
Run Code Online (Sandbox Code Playgroud)

我试过了 string.Join(",", myObjs.Select(x => x.Line));

但这只给了我一个所有Line值的列表.我需要对象中的所有内容.

Ser*_*kiy 7

如果可以手动列出字段:

String.Join(";", myObjs.Select(x => $"{x.Line},{x.Name1},{x.Name2}"))
Run Code Online (Sandbox Code Playgroud)

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

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

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


最后一个选项,如果可以覆盖ToString()你的类的方法:

 public override string ToString() => $"{Line},{Name1},{Name2}";
Run Code Online (Sandbox Code Playgroud)

并且转换此类对象的列表将如下所示

 String.Join(";", myObjs)
Run Code Online (Sandbox Code Playgroud)