使用OR运算符的Lambda表达式

Gri*_*zly 6 c# lambda

我相信有更好的方式来写这个,但我遇到了心理障碍.

int num = 0;

using(var db = new TestDB())
{
    num = db.Table.Where(x => x.FavoriteSport == "Baseball" &&
                             (x.FavoriteColor == "Green" || 
                              x.FavoriteColor == "Blue" || 
                              x.FavoriteColor == "Red")).Count();
}

return num;
Run Code Online (Sandbox Code Playgroud)

是否有更好的方式来编写OR语句?我试过了:

x.FavoriteColor == "Green" || "Blue" || "Red"
Run Code Online (Sandbox Code Playgroud)

但编译说 Operator || cannot be applied to operands of type 'bool' and 'string'

任何帮助表示赞赏.

Val*_*tin 9

您可以使用array/list/hashset的Contains方法.

var colors = new List<string> {"Green", "Red", "Blue" };

db.Table.Where(x => x.FavoriteSport == "Baseball" &&
                         (colors.Contains (x.FavoriteColor)).Count()
Run Code Online (Sandbox Code Playgroud)

它将生成SQL查询

SELECT ... WHERE FavoriteColor = 'Baseball' AND FavoriteColor in ("Green", "Red", "Blue")
Run Code Online (Sandbox Code Playgroud)

我想补充一点,如果你使用存储在内存中的数据集,你应该记住List的Contains需要O(N)迭代来获得结果.因此,如果colors包含大量元素,则应使用集合HashSet而不是O(1).

var colors = new HashSet<string> {"Green", "Red", "Blue", .... };

someDataSet.Where(x => x.FavoriteSport == "Baseball" &&
                         (colors.Contains (x.FavoriteColor)).Count()
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到List-HashSet性能比较

  • 出于好奇,hashset会有性能提升吗?这是对数据库的查询,它被转换为动态SQL,因此它应该遍历整个集合. (2认同)