>我有一个整数列表,它以正确的顺序表示正确的值。我的第二个整数列表是用户值,它们的顺序可能正确,也可能不正确。我想将这些列表合并为一个新列表,但要保持正确列表的顺序。
例:
var correctPositions = _answerActualPositions.Where(x => x != -1);
var userAnswerPositions = _answerViews.Where(x => x.Answered)
.Select(answerView => _answerViews.IndexOf(answerView));
这些是值:
- 正确位置 [4],[1]
- userAnswerPositions [3],[4]
两个列表的元素均为 4,但 userAnswerPositions 必须在元素 0 处具有 4 才能正确。因此,如果我在 C# 中执行查询,我希望它是一个新列表,但为空。
- 正确位置 [4],[1]
- 用户回答位置 [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();