【问题标题】:LINQ filter LIST valuesLINQ 过滤器 LIST 值
【发布时间】:2019-06-13 07:19:53
【问题描述】:

我有 LINQ 查询

Label = c.Name.Translations.Select(label => new Label
                {                        
                    Rus = label.Text,
                    Eng = label.Text,
                }),

翻译类

public int Id { get; set; }

public string Text { get; set; }

public virtual ICollection<Translation> Translations { get; set; }



  public class Translation
    {
        public int Id { get; set; }
        public string Language { get; set; }
        public string Text { get; set; }
    }

这样的返回列表

{
"rus":"Нью-Йорк",
"eng":"Нью-Йорк"
},
{
"rus":"New-York",
"eng":"New-York"

我的目标是拥有一件这样的物品

"rus":"Нью-Йорк",
"eng":"New-York"

如何过滤?

【问题讨论】:

  • 您只想选择第一项?
  • 换句话说,我想合并两个具有适当值的项目。
  • 你能告诉我们Translation类吗?
  • 首先解释一下为什么将它们都设置为相同的值可能会很有用?无需第二次通过,您就有机会实现您想要的。
  • 问题已更新

标签: c# .net linq


【解决方案1】:

这应该可以完成工作:

var labels = new Dictionary<string, string>();
foreach(var item in c.Name.Translations)
{
    labels.add(item.Language, item.Text);
}

编辑

var labels = c.Name.Translations.ToDictionary(t => t.Language, t => t.Text);

【讨论】:

    【解决方案2】:
    var label = c.Name.Translations.ToDictionary(translation => translation.Language, translation => translation.Text);
    

    这将创建一个可以通过以下方式访问的字典

    label["eng"] // This returns "New York"
    

    【讨论】:

      【解决方案3】:

      您可以通过对每个 Label 类属性的 LINQ 查询来实现此目的:

      var resultLabel = new Label
      {
          Eng = Translations.FirstOrDefault(trans => trans.Language == "English")?.Text,
          Rus = Translations.FirstOrDefault(trans => trans.Language == "Russian")?.Text,
      };
      

      【讨论】:

      • 这可行,但会迭代两次集合。理想情况下,它使用 Linq 分组,因此列表只迭代一次,除非性能在这里不重要,在这种情况下,此解决方案简短而实用。
      • @MarkCiliaVincenti 如果您正在寻找 Label 对象作为解决方案,我不觉得有更好的方法。但如果您想要相同的功能而不一定是 ‍‍‍Label 对象,Siavash 答案就是您要找的。​​span>
      【解决方案4】:

      你可以这样做:

      Dictionary<string, string> langText = new Dictionary<string, string>();
      c.Name.Translations.ForEach(x => langText.Add(x.Language, x.Text));
      

      langText 将包含您的数据。

      【讨论】:

      • 我在前面的回答中基本上分享了同样的事情
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 2016-09-05
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多