如何使用另一个列表中的数据更新列表的内容?

时间:2019-04-12 07:53:30

标签: c# linq

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

enter image description here

,我想用它来更新另一个名为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; }
}

通过将汉字>文本匹配在一起并用代码更新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();

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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();