查找列表包含int数组列表

时间:2015-06-02 07:09:25

标签: c# asp.net

嗨我想从我的int数组中找到list.contains基本上我匹配来自我的int数组的列表项

int[] questionName =
{
    19294,
    19300,
    20575,
    20826,
    20827
};

var ans = (from answer in db.tblAnswers
    where answer.tblQuestion.bIsRequired == true
        && questionName.Contains(Convert.ToInt32(answer.nQuestionID))
        &&  (answer.strAnswer!=" " || answer.strAnswer.Trim()==string.Empty)
        && answer.nQuestionnnaireId==Convert.ToInt32(Session["FormId"].ToString())
    select answer).ToList();

List<int> list = new List<int>();
foreach (var i in ans) list.Add(i.nID);
if (list.Contains(Convert.ToInt32(questionName)))
{
    PopulateSurvey();
}

但是当我运行页面时,我得到了运行时错误

  

附加信息:无法转换'System.Int32 []'类型的对象   输入'System.IConvertible'。

我想在我的int数组中匹配我的linq查询中的id。如果有办法,请告诉我。

4 个答案:

答案 0 :(得分:1)

我不确定,但如果PopulateSurvey中包含从数据库中检索到的任何,那么看起来您需要调用questionName。在这种情况下,您可以执行以下操作:

if(list.Intersect(questionName).Any())
    PopulateSurvey();

其他建议:如果您需要的只是id,请不要从数据库中检索整个记录。所以:var list = ... select answer.nId(而不是select answer),请注意,通过这样做,您不再需要手动生成列表。

更新:如果您需要list中包含questionName中的所有项目,请使用以下内容(OrderBy是必需的,因为{{ 1}}要求两个列表中的项目顺序相同):

SequenceEqual

答案 1 :(得分:1)

问题出在

  list.Contains(Convert.ToInt32(questionName))

由于questionName为int[]数组),因此您无法将其转换为单个int。您可能想要找出

如果list包含所有 questionName值(可能还有更多项)

list.Intersect(questionName).OrderBy(x => x).SequenceEqual(questionName.OrderBy(x => x))

如果list包含至少一个 questionName

list.Intersect(questionName).Any()

答案 2 :(得分:0)

你应该遍历'questionName'数组。

然后对于其中的每个项目,检查列表是否包含它。

或者使用Linq,您可以将questionName转换为带有ToList的列表。在那之后你可以做一些魔术。

答案 3 :(得分:0)

你的问题就在这一行

if (list.Contains(Convert.ToInt32(questionName))) //you are trying to convert an array to int

如果要检查如果questionName是列表的子集,则将条件更改为以下

if (!questionName.Except(list).Any())