首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用linq展平对象属性

如何使用linq展平对象属性
EN

Stack Overflow用户
提问于 2012-09-03 16:15:04
回答 4查看 1.5K关注 0票数 0

在我们的本地化数据库中,我们有以下对象:

代码语言:javascript
复制
public class Text
{
  public string Key { get; set; }
  public string LanguageId { get; set; }
  public string Value { get; set; }
}

我需要一个Linq语句来将这些记录扁平化为一个结构,该结构将LanguageIds作为属性,其值如下:

代码语言:javascript
复制
public class ...
{
  public string Key { get; set; }
  public string En { get; set; }
  public string Ge { get; set; }
  public string Fr { get; set; }
  ...
}

当然,这可以通过一些精心设计的“for each”-ing来实现,但必须有一个slik语句来一次性完成这项任务。有没有链接大师?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-03 16:28:59

尝试以下操作:

代码语言:javascript
复制
var flattenTexts = texts
    .GroupBy(x => x.Key)
    .Select(x => new { Key = x.Key, 
                       De = x.First(y => y.LanguageId == "De").Value, 
                       En = x.First(y => y.LanguageId == "En").Value 
                     });

当然,你需要知道你会使用哪种语言。

票数 3
EN

Stack Overflow用户

发布于 2012-11-14 18:52:29

我偶然发现了这一点,只是想为这个问题添加我的解决方案。我冒失地围绕这个表达式创建了一个可运行的小示例:

代码语言:javascript
复制
public class LocalizationManager
{
    public IDictionary<string, Localization> LostInTranslation()
    {
        var input = new[]
                        {
                            new Text {Key = "ORDINAL_1", LanguageId = "En", Value = "first"},
                            new Text {Key = "ORDINAL_1", LanguageId = "Fr", Value = "premier"},
                            new Text {Key = "ORDINAL_1", LanguageId = "De", Value = "erste"},
                            new Text {Key = "ORDINAL_2", LanguageId = "En", Value = "second"},
                            new Text {Key = "ORDINAL_2", LanguageId = "Fr", Value = "deuxième"},
                            new Text {Key = "ORDINAL_2", LanguageId = "De", Value = "zweite"},
                            new Text {Key = "ORDINAL_3", LanguageId = "En", Value = "third"},
                            new Text {Key = "ORDINAL_3", LanguageId = "Fr", Value = "troisième"},
                            new Text {Key = "ORDINAL_3", LanguageId = "De", Value = "dritte"},
                        };

        var output =
            input.GroupBy(text => text.Key).Select(
                group =>
                group.Aggregate(new Localization { Key = group.Key },
                                (translation, text) =>
                                    {
                                        translation.GetType().GetProperty(text.LanguageId).SetValue(translation, text.Value, null);
                                        return translation;
                                    }));

        return output.ToDictionary(key => key.Key);
    }
}

public class Text
{
    public string Key { get; set; }
    public string LanguageId { get; set; }
    public string Value { get; set; }
}

public class Localization
{
    public string Key { get; set; }
    public string En { get; set; }
    public string De { get; set; }
    public string Fr { get; set; }
}

虽然这看起来像是Aggregate()的轻微颠覆,但我认为它的精神是真实的。请注意,所有语言都必须作为“本地化”对象的属性存在,否则当GetProperty()返回null时,您将得到一个NullReferenceException。

票数 4
EN

Stack Overflow用户

发布于 2012-09-03 16:20:49

如果我理解您的意思,您可以从第一个对象创建第二个对象,并将其集成到您的Linq语句中,例如:

代码语言:javascript
复制
  var result = TextObjectList.Select(x => new LanguageObject(x))

在LanguageObject构造函数中,将值设置为LanguageId。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12244191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档