c#join两个int列表,其中值相同且值在同一索引处

时间:2016-07-14 13:18:42

标签: c# linq list lambda

我有一个整数列表,它们以正确的顺序表示正确的值。我的第二个int列表是用户值,它们的顺序可能正确或不正确。我想将这些列表加入到新列表中,但保留正确列表的顺序。

示例:

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

这些是值:

  1. correctPositions [4],[1]
  2. userAnswerPositions [3],[4]
  3. 两个列表都包含4个元素,但userAnswerPositions必须在元素0处有4个才能正确。因此,如果我在C#中进行查询,我希望它是一个新列表但是空。

    1. correctPositions [4],[1]
    2. userAnswerPositions [4],[1]
    3. 另一方面,新查询将返回1个元素,因为4对于两个列表都在同一个元素中。

      我不确定如何处理这个问题。

2 个答案:

答案 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();