从自定义属性计数创建IEnumerable <object>

时间:2016-08-09 13:14:00

标签: c# wpf mvvm

如果事实证明这是一个重复的问题,我会道歉,但我不知道如何找到解决方案。

在目前的情况下,有一些名为&#39;要求&#39;的对象,列在IEnumerable&lt;&gt;中。类型&#39;要求&#39;称为需求,其中包含不同的属性。在某些方法中,从这些属性之一生成列表,然后按出现的数量进行分组。这看起来像:

this.AuthorList = this.Requirements.GroupBy(x => x.Author)
           .Select(x => string.Fortmat("{0} amount {1}", x.Key, x.Count()));

这也意味着当前的IEnumerable是字符串类型。

我想要做的是将{0}和{1}松散地放入1 IEnumerable记录中,这样我就可以在我的视图中使用{Binding}来提取它们以正确对齐它们,从而创建一个令人愉快的UI

我认为我必须创建某种新属性,或者将它们放在List&lt;&gt;中,但我不知道在哪里可以找到我如何去做只是。欢迎任何帮助。

编辑希望创造更多清晰度

2 个答案:

答案 0 :(得分:2)

创建一个新类来保存您的数据:

public class AuthorCount
{
    public string Name { get; set; }
    public int Count { get; set; }
}

并投射到那个:

AuthorList = this.Requirements.GroupBy(x => x.Author)
    .Select(x => new AuthorCount {Name = x.Key, Count = x.Count()})
    .ToList();

AuthorList现在包含IEnumerable<AuthorCount>,您可以绑定到NameCount

答案 1 :(得分:0)

您的选择很多。您可以使用匿名类型(但如果您计划在执行方法之外使用此数据结构,则需要执行其他操作):

...

.Select(x => new { Author = x.Key, Amount = x.Count() });

...

或者,您可以使用Tuple<String, Int32>(但如果您希望其他人真正能够理解您的代码,我建议不要这样做):

...

.Select(x => new Tuple<String,Int32>(x.Key, x.Count()));

...

或者,您可以定义一个不太通用的数据结构,更恰当地传达您提供的信息的含义:

public class RequirementCount {

    public String Label { get; set; }

    public Int32 Count { get; set; }

} 

然后只需选择该类型:

...

.Select(x => new RequirementCount { Label = x.Key, Count = x.Count() });

...