如何简化公寓筛选条件判断逻辑?替代多层if-else方案咨询
更简洁的公寓筛选条件检查方案
绝对有更简洁的方式来处理这种多条件筛选!你遇到的多层嵌套if-else问题,核心是把条件判断扁平化,让每个筛选规则独立出来,最后用逻辑与(&&)组合所有需要满足的条件,完全不用嵌套。
核心思路:独立判断每个筛选条件
对于每个筛选条件,我们只需要判断两种情况:
- 如果条件未定义(值为
UNDEFINED_FILTER),则直接视为满足该条件; - 如果条件已定义,则检查公寓是否符合该条件。
把每个条件的判断结果存为布尔值,最后只要所有布尔值都为true,就打印该公寓信息。
代码示例(扁平化版本)
#define UNDEFINED_FILTER -1 // 遍历公寓链表 while (currentAprt != NULL) { // 逐个判断每个筛选条件,未定义则直接视为满足 bool meetsMaxPrice = (maxPrice == UNDEFINED_FILTER) || (currentAprt->price < maxPrice); bool meetsMinRooms = (minimumNumOfRooms == UNDEFINED_FILTER) || (currentAprt->numOfRooms >= minimumNumOfRooms); bool meetsMaxRooms = (maximumNumOfRooms == UNDEFINED_FILTER) || (currentAprt->numOfRooms <= maximumNumOfRooms); // 如果需要添加日期筛选条件,同样按这个逻辑扩展: // bool meetsEvacDate = (evacDate == UNDEFINED_FILTER) || (/* 你的日期判断逻辑 */); // 所有条件都满足时打印公寓信息 if (meetsMaxPrice && meetsMinRooms && meetsMaxRooms /* && meetsEvacDate */) { printf("Apartment code: %d\n", currentAprt->code); printf("Apartment address: %s\n", currentAprt->address); printf("Apartment price: %d\n", currentAprt->price); printf("Number of rooms: %d\n", currentAprt->numOfRooms); printf("Possible entry date: %s\n", currentAprt->enteryDate); printf("Adding date: %s\n\n", currentAprt->addingDate); } currentAprt = currentAprt->next; }
进一步优化:封装筛选逻辑为函数
如果后续需要添加更多筛选条件,或者想让主逻辑更清晰,可以把筛选判断封装成独立函数,符合单一职责原则:
typedef struct Apartment { int code; char *address; int price; int numOfRooms; char *enteryDate; char *addingDate; struct Apartment *next; } Apartment; #define UNDEFINED_FILTER -1 // 封装筛选逻辑的函数 bool apartmentMeetsCriteria(Apartment *apt, int maxPrice, int minimumNumOfRooms, int maximumNumOfRooms) { if (!apt) return false; // 空指针直接返回不满足 bool priceOk = (maxPrice == UNDEFINED_FILTER) || (apt->price < maxPrice); bool minRoomsOk = (minimumNumOfRooms == UNDEFINED_FILTER) || (apt->numOfRooms >= minimumNumOfRooms); bool maxRoomsOk = (maximumNumOfRooms == UNDEFINED_FILTER) || (apt->numOfRooms <= maximumNumOfRooms); return priceOk && minRoomsOk && maxRoomsOk; } // 主遍历逻辑 void printMatchingApartments(Apartment *head, int maxPrice, int minimumNumOfRooms, int maximumNumOfRooms) { Apartment *currentAprt = head; while (currentAprt != NULL) { if (apartmentMeetsCriteria(currentAprt, maxPrice, minimumNumOfRooms, maximumNumOfRooms)) { // 打印公寓信息 printf("Apartment code: %d\n", currentAprt->code); printf("Apartment address: %s\n", currentAprt->address); printf("Apartment price: %d\n", currentAprt->price); printf("Number of rooms: %d\n", currentAprt->numOfRooms); printf("Possible entry date: %s\n", currentAprt->enteryDate); printf("Adding date: %s\n\n", currentAprt->addingDate); } currentAprt = currentAprt->next; } }
这种方式的优势
- 可读性极强:每个筛选条件的逻辑一目了然,不用在嵌套里找对应分支;
- 扩展性好:新增筛选条件(比如面积、楼层)只需要在判断里加一行布尔值,然后在
if里加一个&&即可; - 易维护调试:可以单独测试每个条件的判断逻辑,定位问题更方便;
- 代码更简洁:完全消除了多层嵌套的“金字塔”结构。
内容的提问来源于stack exchange,提问作者Oran Sherf
相关产品推荐
相关产品推荐

