我可以在单个语句中从集合中进行此linq语句迭代吗?

时间:2013-08-12 09:28:48

标签: c# linq

bool isExist = objCustomization.CustomSettings.Where(p => p.CustomizationType == selCustomizationType && p.CategoryID == selCategoryID).Any();

if (isExist)
{
    chkFixLimit.Checked = objCustomization.CustomSettings.Where(p => p.CustomizationType == selCustomizationType && p.CategoryID == selCategoryID).FirstOrDefault().IsDefaultLimit;
}
else chkFixLimit.Checked = false;

5 个答案:

答案 0 :(得分:5)

布尔值的默认值为false,因此您甚至不需要任何条件 - 只需选择第一个或默认IsDefaultLimit值:

chkFixLimit.Checked =
   objCustomization.CustomSettings
       .Where(p => p.CustomizationType == selCustomizationType && p.CategoryID == selCategoryID)
       .Select(p => p.IsDefaultLimit)
       .FirstOrDefault();

UPDATE(回答你的评论),如果你有非布尔值或默认值(整数为零)不符合你的要求,DefaultIfEmpty你可以提供自己的默认值,如果没有匹配的项目你的情况:

maxCountCmb.SelectedIndex = 
    objCustomization.CustomSettings
        .Where(p => p.CustomizationType == selCustomizationType && p.CategoryID == selCategoryID)
        .Select(p => p.DefaultFreeCount)
        .DefaultIfEmpty(-1)
        .First();

答案 1 :(得分:3)

当然可以:

var item = objCustomization.CustomSettings.FirstOrDefault(p => p.CustomizationType == selCustomizationType && p.CategoryID == selCategoryID);

chkFixLimit.Checked = item != null && item.IsDefaultLimit;

或单一陈述,如您所愿:

chkFixLimit.Checked = new Func<bool>(() => {
    var item = objCustomization.CustomSettings.FirstOrDefault(p => p.CustomizationType == selCustomizationType && p.CategoryID == selCategoryID);
    return item != null && item.IsDefaultLimit;
}).Invoke();

答案 2 :(得分:2)

这不是一行,但它更具可读性,你可以改变:

var setting = objCustomization.CustomSettings              
                .FirstOrDefault(p => p.CustomizationType == selCustomizationType 
                                  && p.CategoryID == selCategoryID);

chkFixLimit.Checked = setting == null ? false : setting.IsDefaultLimit;

答案 3 :(得分:2)

chkFixLimit.Checked = objCustomization.CustomSettings
  .Where(p => p.CustomizationType == selCustomizationType 
     && p.CategoryID == selCategoryID)
  .Select(c => c.IsDefaultLimit)
  .FirstOrDefault();

答案 4 :(得分:1)

该代码或多或少是FirstOrDefault方法的用例。如果存在某些内容,则返回第一个此类项,如果不存在,则返回默认值(null作为参考类型)。所以你可以这样做:

var item = objCustomization.CustomSettings.FirstOrDefault
               (p => p.CustomizationType == selCustomizationType && p.CategoryID)

因此,item对象将为null(假设您确实使用了引用类型),或者它将具有值。
之后你可以用一个简单的

检查一下
chkFixLimit.Checked = (item == null) ? false : item.IsDefaultLimit;