【问题标题】:How can I update the contents of a list with data from another list?如何使用另一个列表中的数据更新列表的内容?
【发布时间】:2019-04-12 07:53:30
【问题描述】:

我有一个名为 Kanjis 的两个属性的列表:

我想用它来更新另一个名为PhraseSources的列表的内容

public class PhraseSource
{
    [PrimaryKey]
    public string Id { get; set; }
    public int PhraseNum { get; set; }
    public string English { get; set; }
    public string Kanji { get; set; }
    public string WordType { get; set; }
    public string FrequencyA { get; set; }
}

通过匹配 Kanji > Text 并使用 Code 更新 FrequencyA

这是可以用 LINQ 完成的,还是有更好的方法通过遍历短语Source 的每一行、检查 Kanjis 中的匹配条目并以这种方式进行更新来做到这一点?

这是我尝试过的 Salva 建议的代码:

(from sa in source
         join d in psDb on sa.Text equals d.Kanji
         let temp = d.FrequencyA = sa.Code
         select 0).ToList();

给出错误:

ApplyFrequency.cs(14,14):错误 CS1941:其中一个的类型 join 子句中的表达式不正确。类型推断失败 呼吁“加入”。 (CS1941) (下载)

 source.Join(psDb, s => s.Text, d => d.Kanji, (s, d) => d.FrequencyA = s.Code).ToList();

给出错误:

ApplyFrequency.cs(21,21):错误 CS0411:方法的类型参数 'Enumerable.Join(IEnumerable, IEnumerable, Func, Func, Func)' 不能从用法中推断出来。尝试 明确指定类型参数。 (CS0411) (下载)

注意事项:

当我被要求将 FrequencyA 更改为 int 时,我不得不使用此代码:

var source = original
                    .Select(x => new 
                    {
                        Text = x.Text,
                        Code = Convert.ToInt32(x.Code.Substring(2))
                    })
                    .ToList();

【问题讨论】:

  • 你可以join列表,迭代结果并更新它。
  • @Alan2 显示sourcepsDb 变量及其类型的声明

标签: c# linq


【解决方案1】:

您可以通过单个 linq 查询语法

var source = new List<TextCodeClass>();
var dest = new List<PhraseSource>();

(from s in source
 join d in dest on s.Text equals d.Kanji 
 let temp = d.FrequencyA = s.Code.ToString()
 select 0).ToList();

或通过方法语法

source.Join(dest, s => s.Text, d => d.Kanji, (s, d) => d.FrequencyA = s.Code.ToString())
      .ToList();    

【讨论】:

  • 您好 Slava,您使用 from 和 join 的格式名称是什么?
  • @Alan2,是linq查询语法
  • 嗨 Slava,我还在学习 LINQ。它似乎非常强大。查询语法是否有另一种形式?我以前没有看到它用 LINQ 写成这样。能不能写在. form 或者是否有一些查询必须像您一样使用 from、in 和 join 编写?
  • @Alan2 您可以在此链接中阅读有关 LINQ 查询语法和 LINQ 方法语法的更多信息。 tutorialsteacher.com/linq/linq-query-syntax。你习惯看到的可能是LINQ方法语法。
  • @Alan2,是的,您也可以使用方法语法。查看更新的答案。
【解决方案2】:

您只能通过 LINQ 更新列表。你能得到的最接近的是:

static void Main(string[] args)
{
  List<SomeClass> scl = new List<SomeClass>();
  List<OtherClass> ocl = new List<OtherClass>();

  foreach (var item in scl)
    item.FrequencyA = ocl.Where(i => i.Text == item.Kanji).FirstOrDefault()?.Code ?? null;
}

// sample classes that reflect relevant properties
public class SomeClass
{
  public string FrequencyA { get; set; }
  public string Kanji { get; set; }
}

public class OtherClass
{
  public string Code { get; set; }
  public string Text { get; set; }
}

【讨论】:

  • 嗨,Michal,你的意思是“你不能更新..”在你的回答中吗? Slava 建议了一个 LINQ 解决方案,所以我对它是否可以完成以及一种方法或其他方法的性能影响有点困惑。谢谢
  • 我建议使用ocl HashSet 而不是列表,如果Text 是唯一的,那么Dictionary&lt;string,string&gt; 更好
  • @GiladGreen 感谢您的评论,但使用的集合只是为了提供解决方案:)
  • @Alan2 好吧,也许使用 LINQ 的查询语法是可能的。我没有意识到这一点
猜你喜欢
  • 2020-11-04
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
相关资源
最近更新 更多