首页 > 解决方案 > 如何使用另一个列表中的数据更新列表的内容?

问题描述

我有一个名为的两个属性的列表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 完成的事情,还是有更好的方法通过遍历短语来源的每一行,检查 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:连接子句中的表达式之一的类型不正确。对“加入”的调用中的类型推断失败。(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();

标签: c#linq

解决方案


您只能通过 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; }
}

推荐阅读