我有一个名为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; }
}
通过将汉字>文本匹配在一起并用代码更新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();
答案 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();