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

时间:2017-02-09 23:06:47

标签: c# linq

我有一个这样的课程:

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 个答案:

答案 0 :(得分:7)

如果可以手动列出字段:

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 :(得分: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 } )
             ));

答案 2 :(得分: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)));
    }