【问题标题】:Select value and flatten sublist of objects within a list of objects在对象列表中选择值并展平对象子列表
【发布时间】:2018-09-19 10:34:08
【问题描述】:

我有一个对象列表,其中列表中的每个对象都包含一个对象列表。我需要从子列表中的每个对象中选择一个字符串并将其包含在主列表中。基本上将子列表展平。

我们的目标是在电子表格中输入这些数据。

这是我的两个模型

class Phrase
{
    public string Parent { get; private set; }
    public string Value { get; private set; }
}
class Translation
{
    public string Key { get; private set; }
    public string Translatable { get; private set; }
    public List<Phrase> Phrases { get; private set; }
}

这就是列表的样子

{ Key = "coffee", Translatable = "", Phrase = [{ Parent = "English", Value = "Coffee" }, { Parent = "Swedish", Value = "Kaffe" }] },
{ Key = "candy", Translatable = "", Phrase = [{ Parent = "English", Value = "Candy" }, { Parent = "Swedish", Value = "Godis" }] },
{ Key = "computer", Translatable = "", Phrase = [{ Parent = "English", Value = "Computer" }, { Parent = "Swedish", Value = "Dator" }] }

正如我所说,目标是将这些数据插入到电子表格中,所以根据上面的列表,电子表格理论上应该是这样的:

Key      | Translatable | English  | Swedish
---------------------------------------------
coffee   |              | Coffee   | Kaffe
candy    |              | Candy    | Godis
computer |              | Computer | Dator

我只关心 Phrase 对象中的Value

您可以像这样从列表中选择KeyTranslatable

var query = from t in parser.translations
        from p in t.Phrases
        select new { t.Key, t.Translatable };

这会产生

{ Key = "coffee", Translatable = ""},
{ Key = "candy", Translatable = ""},
{ Key = "computer", Translatable = ""}

但是我如何将短语列表中的所有值包含到每个对象中?目标是这样的:

{ Key = "coffee", Translatable = "", Value1 = "Coffee", Value2 = "Kaffe"},
{ Key = "candy", Translatable = "", Value1 = "Candy", Value2 = "Godis"},
{ Key = "computer", Translatable = "", Value1 = "Computer", Value2 = "Dator"}

任何帮助表示赞赏。

【问题讨论】:

  • 我想你快到了。试试这个:var query = from t in parser.translations from p in t.Phrases select new { Key = t.Key, Translatable = t.Translatable, Value1 = p.Single(phrase =&gt; phrase == "English").Value, Value2 = p.Single(phrase =&gt; phrase == "Swedish").Value };
  • 我怀疑这是可能的。问题是您的结果的Value1Value2Value3.. 中的递增计数器。 linq 的select 语句中有一个重载,它有一个索引作为参数,但我看不到这个 heps。但我很想被证明是错误的。
  • var query = from t in parser.translations select new { t.Key, t.Translatable, Phrases = t.Phrases.Select(z =&gt; z.Value).ToList() }; 返回什么?这对您的上下文有用吗?

标签: c# linq lambda closedxml


【解决方案1】:

如果您总是在短语(英语、瑞典语)中获得两个键并且只需要值。 你可以试试这个。

为结果添加一个新类

class tr
{
    public string Key { get; set; }
    public string trn { get; set; }
    public string English { get; set; }
    public string Swedish { get; set; }
}

并使用此查询

var query = from t in translations
        select new tr() 
        { 
            Key = t.Key, 
            trn = t.Translatable, 
            English = t.Phrases.Single(p => p.Parent == "English").Value, 
            Swedish = t.Phrases.Single(p => p.Parent == "Swedish").Value 
        };

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 2022-07-21
    • 1970-01-01
    • 2015-02-03
    • 2018-11-16
    • 2023-03-18
    • 2011-04-25
    • 2023-02-08
    • 2019-09-17
    相关资源
    最近更新 更多