C# 如何使用其他列表中的数据更新列表的内容?

C# 如何使用其他列表中的数据更新列表的内容?,c#,linq,C#,Linq,我有一个名为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; }

我有一个名为
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; }
}
通过匹配汉字>文本并使用代码更新频率

这是可以用LINQ实现的吗?还是有更好的方法来实现这一点,通过迭代phraseSource的每一行,检查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)(下载)

给出错误:

cs(21,21):错误CS0411:方法的类型参数 '可枚举.连接(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();

您只能通过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; }
}
static void Main(字符串[]args)
{
List scl=新列表();
List ocl=新列表();
foreach(scl中的变量项)
item.FrequencyA=ocl.Where(i=>i.Text==item.Kanji).FirstOrDefault()?.Code??null;
}
//反映相关属性的示例类
公共类
{
公共字符串频率a{get;set;}
公共字符串汉字{get;set;}
}
公共类其他类
{
公共字符串代码{get;set;}
公共字符串文本{get;set;}
}

您可以通过单个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();    

您可以编辑列表,迭代结果并更新它。@Alan2显示
源代码
psDb
变量及其类型的声明Shello Slava,您使用的from和join格式的名称是什么?@Alan2,这是linq查询syntaxHi Slava,我仍在学习linq。它似乎很强大。查询语法是否有其他形式?我以前在LINQ身上没见过这样写的。有可能用英文写吗。表单或是否有一些查询必须像您那样使用from、in和join编写?@Alan2您可以在此链接中阅读有关LINQ查询语法和LINQ方法语法的更多信息。您习惯看到的可能是LINQ方法语法。@Alan2,是的,您也可以使用方法语法。看看更新后的答案。嗨,迈克尔,你的答案中是不是说“你不能更新…”?Slava提出了一个LINQ解决方案,所以我对它是否可以实现以及一种或另一种方法的性能影响感到有点困惑。谢谢我建议使用
ocl
a
HashSet
而不是列表,如果
文本
是唯一的,那么更好的
Dictionary
@GiladGreen谢谢您的评论,但是使用集合只是为了展示解决方案:)@Alan2好吧,也许使用LINQ的查询语法是可能的。我不知道
source.Join(dest, s => s.Text, d => d.Kanji, (s, d) => d.FrequencyA = s.Code.ToString())
      .ToList();