C# 联接两个 int 列表,其中值相同且值位于同一索引处



>我有一个整数列表,它以正确的顺序表示正确的值。我的第二个整数列表是用户值,它们的顺序可能正确,也可能不正确。我想将这些列表合并为一个新列表,但要保持正确列表的顺序。

例:

 var correctPositions = _answerActualPositions.Where(x => x != -1);
 var userAnswerPositions = _answerViews.Where(x => x.Answered)
     .Select(answerView => _answerViews.IndexOf(answerView));

这些是值:

  1. 正确位置 [4],[1]
  2. userAnswerPositions [3],[4]

两个列表的元素均为 4,但 userAnswerPositions 必须在元素 0 处具有 4 才能正确。因此,如果我在 C# 中执行查询,我希望它是一个新列表,但为空。

  1. 正确位置 [4],[1]
  2. 用户回答位置 [4],[1]

另一方面,使用新查询将返回 1 个元素,因为两个列表的 4 位于同一元素中。

我不确定处理这个问题的好方法。

您可以使用按

索引连接的Zip

var resultlist = correctPositions.Zip(userAnswerPositions,
    (a1, a2) => new { a1, a2 }) // join both into an anonymous type using the index
    .Where(x => x.a1 == x.a2)   // filter out, only same values are allowed
    .Select(x => x.a2)          // you want a List<int> as result, so select one of both ints(are same anyway)
    .ToList();                  // create the list

假设 correctPositions 和 userAnswerPositions 具有相同的大小,并且我正确理解了您,这就是您所追求的,对吧?

var result = correctPositions.Select((cp, i) => cp == userAnswerPositions[i] ? cp : (int?) null).ToList();

这假设当两个列表中的值不匹配时,你将获得 null。

如果,如注释中所述,userAnswerPositions 较小,则可以在 lambda 中使用 correctPositions 来反转它的位置。

此外,如果您不关心在结果中维护相同的索引,而只想返回在两个列表中具有相同值和索引的项目,您可以这样做:

var result = userAnswerPositions.Where((uap, i) => uap == correctPositions[i]).ToList();

相关内容

  • 没有找到相关文章

最新更新