【问题标题】:problem using foreach in linq query result在 linq 查询结果中使用 foreach 的问题
【发布时间】:2011-04-11 00:52:15
【问题描述】:

我的 linq 查询如下:

var result = (from Customer cust in db select new { userNameList = cust.UserName }).ToList();

我想遍历列表中的每个值

我尝试使用 foreach 来完成此操作。太笨了,我想不通

我正在使用类似的东西

foreach (List<string> item in result)
            {
                if (item.ToString() == userName)
                {
                    userExistsFlag = 1;
                }
            }

但是 .net 编译器只是吓坏了:

并给我这些错误

  1. 无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List”

  2. 无法将类型“AnonymousType#1”转换为“System.Collections.Generic.List”

感谢期待

在所有这些实现中,哪一个是最高效且消耗资源更少的。 如果有人能为我澄清这一点,那就太好了。

【问题讨论】:

  • 上面代码中的db是什么类型的?

标签: c# asp.net linq


【解决方案1】:

使用 Linq 更短:

bool userExistsFlag  = result.Any( x=> x.userNameList  == userName);

正如其他答案中所建议的,您不需要投影到匿名类型:

var userNames = (from Customer cust in db select cust.UserName).ToList();
bool userExists = userNames.Contains(userName);

编辑:

最高效的——如果你不需要用户名的集合,否则——是直接查询DB来检查用户名是否存在,所以

 bool userExists = db.Any( x => x.UserName == userName);

cmets 中的 @Chris Shaffer 和 @Cyber​​natet 的回答归功于 @Chris Shaffer - 他几乎就在那里。我建议你接受他的回答,但使用 Any() ;-)

【讨论】:

  • +1 - 最有效的方法bool userExistsFlag = db.Any(x =&gt; x.UserName == userName) (你几乎有它:))。
  • 这怎么可能? db.Any(x => x.UserName == userName) ... 'db' 不会有多个表吗? .. 编辑:没关系.. 'db' 只是客户表.. 我从字面上理解 :)
【解决方案2】:

试试:

var result = (from Customer cust in db select new { userNameList = cust.UserName }).ToList();
userExistsFlag = result.Where(a=> a.userNameList == userName).Count() > 0;

or

userExistsFlag = (
                    from Customer cust in db 
                    where cust.UserName = userName
                    select cust
                 ).Count() > 0;

【讨论】:

  • 不应该是 cust.UserName == userName
  • -1 - .Count() > 0 不应用于检测存在 - 这就是 .Any() 的用途。
【解决方案3】:

如果您的查询返回名称列表,则您的 FOREACH 循环应如下所示

foreach( String name in results ){
  ...
}

【讨论】:

    【解决方案4】:

    使用new { userNameList = cust.UserName } 跳过这使其成为匿名实例。你可以试试

    var result = (from Customer cust in db select cust.UserName ).ToList();
    

    【讨论】:

      【解决方案5】:

      如果您只是获得一个属性并想要一个字符串列表,则没有理由使用匿名类型。代码应该像这样工作:

      var result = (from Customer cust in db select cust.UserName).ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        相关资源
        最近更新 更多