我有一个整数列表,它们以正确的顺序表示正确的值。我的第二个int列表是用户值,它们的顺序可能正确或不正确。我想将这些列表加入到新列表中,但保留正确列表的顺序。
示例:
var correctPositions = _answerActualPositions.Where(x => x != -1);
var userAnswerPositions = _answerViews.Where(x => x.Answered)
.Select(answerView => _answerViews.IndexOf(answerView));
这些是值:
两个列表都包含4个元素,但userAnswerPositions必须在元素0处有4个才能正确。因此,如果我在C#中进行查询,我希望它是一个新列表但是空。
另一方面,新查询将返回1个元素,因为4对于两个列表都在同一个元素中。
我不确定如何处理这个问题。
答案 0 :(得分:1)
您可以使用按索引加入的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
答案 1 :(得分:0)
假设correctPositions和userAnswerPositions具有相同的大小并且我正确地理解了你,那么你就是这样,对吗?
var result = correctPositions.Select((cp, i) => cp == userAnswerPositions[i] ? cp : (int?) null).ToList();
这假定当两个列表中的值不匹配时,您将为空。
如果在注释中解释,userAnswerPositions较小,则可以使用lambda中的correctPositions反转其位置。
此外,如果您不关心在结果中维护相同的索引,并且只想返回两个列表中具有相同值和索引的项,您可以这样做:
var result = userAnswerPositions.Where((uap, i) => uap == correctPositions[i]).ToList();