使用lambda聚合匿名类型

时间:2013-12-09 20:12:28

标签: c# linq lambda

我正在尝试以{type}:{number}格式打印出电话号码列表(每个号码为\ n)。所以我会打印出两个数字列表:

 Home: 111-111-1111
 Cell: 222-222-2222

到目前为止,我可以选择匿名类型但是当我去聚合时,它会在屏幕上打印出整个匿名类型,看起来完全如下:

 new { phoneType = Home + ": ", phoneNumber = 111-111-1111 }

我是否应该使用聚合? 这就是我正在使用的:

  PhoneNumbers.Select(x => new { phoneType = x.PhoneType, phoneNumber = x.PhoneNumber1 }).Aggregate(
                (p, x) => new { phoneType = p.phoneType + ": ", x.phoneNumber });

2 个答案:

答案 0 :(得分:4)

如果您只想将电话号码作为字符串,则可以在Select电话中创建该字符串:

var x = PhoneNumbers.Select(x => string.Format("{0}: {1}", x.PhoneType, x.PhoneNumber));

您的聚合呼叫基本上是一个错误(假设它甚至可以编译),因为您将“当前”电话号码与之前的电话类型相结合。由于现有的字符串方法,将电话号码组合为文本也是不必要的:

var phoneNumberStrings = PhoneNumbers.Select(x => string.Format("{0}: {1}", x.PhoneType, x.PhoneNumber));
var text = string.Join(Environment.NewLine, phoneNumberStrings);

答案 1 :(得分:2)

虽然您可以使用IEnumerable<string>.Aggregate执行此操作,但如果您只使用string.Join,我觉得它更清晰。如果他们看到“使用换行符加入这些字符串”,那么阅读代码的人将能够更轻松地获得意义。

string.Join(
    Environment.NewLine,
    PhoneNumbers.Select(x =>
        string.Format("{0}: {1}", x.PhoneType, x.PhoneNumber));