如何优化这段代码?

时间:2014-10-02 09:27:06

标签: c# optimization

我有以下代码:

    protected StoreDetailModel GetSelectedStore()
    {
        if (StoresWithDepartmentType != null && StoresWithDepartmentType.Any())
        {
            StoreDetailModel currentUserStore = WebsiteContext.GetCurrentUserStore();

            if (currentUserStore != null && currentUserStore.Item != null)
            {
                StoreDetailModel store = 
                   StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID ==    
                                                 currentUserStore.Item.ID);
                if (store == null)
                {
                    store = StoresWithDepartmentType.First();
                }
                return store;
            }
        }
        return null;
    }

太多ifs使这段代码难以理解。如何优化它并使其更清晰?

4 个答案:

答案 0 :(得分:0)

你可以写

return StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID == currentUserStore.Item.ID) ?? StoresWithDepartmentType.First();

而不是

 StoreDetailModel store = 
               StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID ==    
                                             currentUserStore.Item.ID);
            if (store == null)
            {
                store = StoresWithDepartmentType.First();
            }
            return store;
但有些人并不喜欢这样。如果看起来是必要的,那么他们就不会打扰我。

答案 1 :(得分:0)

您的代码希望返回当前用户存储,如果找不到,则返回null。它可以简化如下。

protected StoreDetailModel GetSelectedStore()
{
    if (StoresWithDepartmentType == null) return null; // There are no stores

    // Get the user store or return the first available store
    StoreDetailModel currentUserStore = WebsiteContext.GetCurrentUserStore();
    return currentUserStore ?? StoresWithDepartmentType.First();
}

如果没有要查找的商店,则无法返回任何内容。

否则返回用户的商店,或者如果找不到用户的商店,则可以返回第一个可用商店。

简化有效,因为StoresWithDepartmentType上的查找似乎返回相同的对象。

答案 2 :(得分:0)

没有必要嵌套if-blocks,所以我将结构弄平以便于阅读。

最后一行'返回'声明来自artm的答案。

protected StoreDetailModel GetSelectedStore()
{
    if (StoresWithDepartmentType == null || !StoresWithDepartmentType.Any())
    {
        return null;
    }

    StoreDetailModel currentUserStore = WebsiteContext.GetCurrentUserStore();
    if (currentUserStore == null || currentUserStore.Item == null)
    {
        return null;
    }

    return StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID == currentUserStore.Item.ID) ?? StoresWithDepartmentType.First();
}

答案 3 :(得分:0)

我将它分成许多名称很好的方法。

这不会编译(因为我不知道你正在使用的所有类型),但希望它会给你这个想法:

protected StoreDetailModel GetSelectedStore()
{
    if (anyStoresWithDepartmentType())
        return storeWithCurrentlySelectedItem();

    return null;
}

private bool anyStoresWithDepartmentType()
{
    return (StoresWithDepartmentType != null) && StoresWithDepartmentType.Any();
}

private StoreDetailModel storeWithCurrentlySelectedItem()
{
    var itemId = currentUserStoreItemId();

    if (itemId == null)
        return null;

    return storeWithItem(itemId);
}

private StoreItemId currentUserStoreItemId()
{
    StoreDetailModel currentUserStore = WebsiteContext.GetCurrentUserStore();

    if (currentUserStore != null && currentUserStore.Item != null)
        return currentUserStore.Item.ID;

    return null;
}

private StoreDetailModel storeWithItem(StoreItemId itemId)
{
    StoreDetailModel store = StoresWithDepartmentType.FirstOrDefault(x => x.Item.ID == itemId);

    if (store != null)
        return store;

    return StoresWithDepartmentType.First();
}