Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ,将列表与适当的';覆盖';_C#_Linq - Fatal编程技术网

C# LINQ,将列表与适当的';覆盖';

C# LINQ,将列表与适当的';覆盖';,c#,linq,C#,Linq,这种情况可能比我希望的要复杂得多,但无论如何我都要把它说出来。这是一个游戏类型的设计 这里的值是硬编码的,但在实际环境中并非如此 基本上,有称为解释器的类列表,其中包含适当的信息,用于在程序引擎中翻译其他内容。它们有一个默认的“布局”,但在许多特殊情况下,其中一些需要覆盖 一个解决方案是在每个列表中都有每个实例(这是可行的,但我真的认为这是多余的,而且我认为存在一个更干净的解决方案),相反,我想“组合”它们,但能够指定一个属性用作“覆盖”。(完整的源代码可以在pastie上找到。我想把它放在这里

这种情况可能比我希望的要复杂得多,但无论如何我都要把它说出来。这是一个游戏类型的设计

这里的值是硬编码的,但在实际环境中并非如此

基本上,有称为
解释器
的类列表,其中包含适当的信息,用于在程序引擎中翻译其他内容。它们有一个默认的“布局”,但在许多特殊情况下,其中一些需要覆盖

一个解决方案是在每个列表中都有每个实例(这是可行的,但我真的认为这是多余的,而且我认为存在一个更干净的解决方案),相反,我想“组合”它们,但能够指定一个属性用作“覆盖”。(完整的源代码可以在pastie上找到。我想把它放在这里,但我被告知,放这么多代码会阻止人们回答我的问题):


当然,我知道如何通过这个具体的例子来实现它。我可以简单地编写一个方法来检查分数的值,等等。但是我想要一个更基于约定的方法,我可以以更复杂的方式使用它。有人有什么想法吗?

要获得您描述的结果,您可以使用以下方法:

Sheet Combine(Sheet initial, Sheet advanced)
{
    Sheet result = new Sheet();
    result.Interpreters = new List<Interpreter>(
        initial.Interpreters.Select(i =>
            advanced.Interpreters.SingleOrDefault(a => a.Score == i.Score) ?? i)
        );
    return result;
}
编辑2

以下是您要求的LINQ解决方案:

Sheet Combine(Sheet initial, Sheet advanced)
{
  var scores = initial.Interpreters.Select(i => i.Score)
    .Concat(advanced.Interpreters.Select(i => i.Score))
    .Distinct().OrderBy(i => i);
  var interpreters = scores.Select(s =>
    advanced.Interpreters.SingleOrDefault(i => i.Score == s)
    ?? initial.Interpreters.Single(i => i.Score == s));
  return new Sheet { Interpreters = interpreters };
}

我不能使用字典,因为这将不可避免地被序列化到数据库中,实体框架目前不能正确支持字典,并且我的团队中的其他人出于各种原因不会使用nHibernate。只要“高级”工作表没有初始工作表所具有的任何功能,这就解决了问题。但是如果高级工作表有任何额外的信息,它就不会得到这些信息。谢谢。这会让我开始。我正在考虑如何处理这样一种情况:我有两张以上的床单需要合并。但是我认为这给了我在这两种解决方案之间需要的东西。不过,你认为有基于Linq的解决方案吗?林克有很多我不太明白的地方。我尝试了工会,但它并没有完全满足我的要求。
Sheet Combine(Sheet initial, Sheet advanced)
{
    Sheet result = new Sheet();
    result.Interpreters = new List<Interpreter>(
        initial.Interpreters.Select(i =>
            advanced.Interpreters.SingleOrDefault(a => a.Score == i.Score) ?? i)
        );
    return result;
}
Sheet Combine(Sheet initial, Sheet advanced)
{
  var interpreters = new List<Interpreter>(initial.Interpreters);
  foreach (var interpreter in advanced.Interpreters)
  {
    int index = interpreters.FindIndex(x => x.Score == interpreter.Score);
    if (index < 0)
      interpreters.Add(interpreter);
    else
      interpreters[index] = interpreter;
  }

  return new Sheet { Interpreters = interpreters };
}
Sheet Combine(Sheet initial, Sheet advanced)
{
  var scores = initial.Interpreters.Select(i => i.Score)
    .Concat(advanced.Interpreters.Select(i => i.Score))
    .Distinct().OrderBy(i => i);
  var interpreters = scores.Select(s =>
    advanced.Interpreters.SingleOrDefault(i => i.Score == s)
    ?? initial.Interpreters.Single(i => i.Score == s));
  return new Sheet { Interpreters = interpreters };
}