網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
本篇是針對(duì)我在做項(xiàng)目過(guò)程中遇到的特定需求而做的一個(gè)Demo, 沒(méi)有很大的通用性,讀者酌情可繞行。
標(biāo)題不能完全表達(dá)本意,確切的情景需要展開(kāi)說(shuō)。假設(shè)有三級(jí)分類,關(guān)于分類這樣設(shè)計(jì):
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
}
然后產(chǎn)品可以屬于多個(gè)分類,以下的Categories屬性值是以英文逗號(hào)隔開(kāi)、由分類編號(hào)拼接而成的字符串。
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Categories { get; set; }
}
由于種種原因,Categories屬性值只是存儲(chǔ)了由第三級(jí)分類編號(hào)拼接而成的字符串。
在前端,需要把分類作為查詢條件來(lái)查詢產(chǎn)品,可能只選擇一級(jí)分類,把一個(gè)數(shù)字字符串(比如"1")發(fā)送給服務(wù)端;可能同時(shí)選擇一級(jí)和二級(jí)分類,也把一個(gè)數(shù)字字符串(比如"1,2")發(fā)送給服務(wù)端;當(dāng)然,也有可能同時(shí)選擇一級(jí)、二級(jí)和三級(jí)分類作為查詢條件(比如"1,2,3")。換句話說(shuō),如果諸如"1"或"1,2"或"1,2,3"這樣的查詢條件轉(zhuǎn)換成數(shù)組后,如果數(shù)組的每一個(gè)元素都被包含在Product的Categories屬性值轉(zhuǎn)換成的數(shù)組中,那這個(gè)產(chǎn)品就符合搜索條件。
簡(jiǎn)單來(lái)說(shuō),是這樣:假設(shè)搜索條件是"1,2",Product的Categories屬性值為"1,3,2,5",我們不是判斷"1,2"這個(gè)字符串是否包含在"1,3,2,5"字符串中,而是把"1,2"先split成數(shù)組,叫做array1, 把"1,3,2,5"也split成數(shù)組,叫做array2,最后判斷array1的每個(gè)元素是否都被包含在array2中。
還有一個(gè)問(wèn)題需要解決:當(dāng)前的Product的Categories屬性值只存儲(chǔ)了所有第三級(jí)分類編號(hào)拼接成的字符串,而前端輸入的搜索條件可能會(huì)包含一級(jí)分類或二級(jí)分類等,所以,我們需要把Product轉(zhuǎn)換一下,希望有一個(gè)類的某個(gè)屬性值能存儲(chǔ)由一級(jí)、二級(jí)、三級(jí)分類拼接而成的字符串。
public class ProductWithThreeCate
{
public int Id { get; set; }
public string Name { get; set; }
public string AllCategoreis { get; set; }
}
以上, AllCategoreis屬性值就用來(lái)存儲(chǔ)由一級(jí)、二級(jí)、三級(jí)分類拼接而成的字符串。
有一個(gè)方法獲取所有分類:
static List<Category> GetCategories()
{
return new List<Category>()
{
new Category(){Id = 1, Name = "根", ParentId = -1},
new Category(){Id = 2, Name = "一級(jí)分類1",ParentId = 1},
new Category(){Id = 3, Name = "一級(jí)分類2", ParentId = 1},
new Category(){Id = 4, Name = "二級(jí)分類11",ParentId = 2},
new Category(){Id = 5, Name = "二級(jí)分類12",ParentId = 2},
new Category(){Id = 6, Name = "二級(jí)分類21",ParentId = 3},
new Category(){Id = 7, Name = "二級(jí)分類22",ParentId = 3},
new Category(){Id = 8, Name = "三級(jí)分類111",ParentId = 4},
new Category(){Id = 9, Name = "三級(jí)分類112",ParentId = 4},
new Category(){Id = 10, Name = "三級(jí)分類121",ParentId = 5},
new Category(){Id = 11, Name = "三級(jí)分類122",ParentId = 5},
new Category(){Id = 12, Name = "三級(jí)分類211",ParentId = 6},
new Category(){Id = 13, Name = "三級(jí)分類212",ParentId = 6},
new Category(){Id = 14, Name = "三級(jí)分類221",ParentId = 7}
};
}
有一個(gè)方法獲取所有產(chǎn)品:
static List<Product> GetProducts()
{
return new List<Product>()
{
new Product(){Id = 1, Name = "產(chǎn)品1",Categories = "10,12"},
new Product(){Id = 2, Name = "產(chǎn)品2", Categories = "12,13"},
new Product(){Id = 3, Name = "產(chǎn)品3",Categories = "10,11,12"},
new Product(){Id = 4, Name = "產(chǎn)品4",Categories = "13,14"},
new Product(){Id = 5, Name = "產(chǎn)品5",Categories = "11,13,14"}
};
}
接下來(lái)的方法是根據(jù)搜索條件(比如是"1,2")來(lái)查找滿足條件的ProductWithThreeCate集合,如下:
/// <summary>
/// 獲取滿足某些條件的集合
/// </summary>
/// <param name="query">以英文逗號(hào)隔開(kāi)的字符串,比如:2,5</param>
/// <returns></returns>
static List<ProductWithThreeCate> GetResultByQuery(string query)
{
//最終結(jié)果
List<ProductWithThreeCate> result = new List<ProductWithThreeCate>();
//臨時(shí)結(jié)果 此時(shí)ProductWithThreeCat的屬性AllCategoreis包含所有一級(jí)、二級(jí)、三級(jí)分類ID拼接成的字符串
List<ProductWithThreeCate> tempResult = new List<ProductWithThreeCate>();
//獲取所有的產(chǎn)品
List<Product> allProducts = GetProducts();
//遍歷這些產(chǎn)品
foreach (var item in allProducts)
{
ProductWithThreeCate productWithThreeCate = new ProductWithThreeCate();
productWithThreeCate.Id = item.Id;
productWithThreeCate.Name = item.Name;
//所有一級(jí)、二級(jí)、三級(jí)拼接成以英文逗號(hào)隔開(kāi)的字符串
string temp = string.Empty;
//當(dāng)前產(chǎn)品只包含三級(jí)拼接成的、也是以英文隔開(kāi)的字符串,split成數(shù)組
string[] theThirdCates = item.Categories.Split(',');
//遍歷這些三級(jí)數(shù)組
foreach (string i in theThirdCates)
{
//三級(jí)類別轉(zhuǎn)換成整型
int theThirdInt = int.Parse(i);
//獲取三級(jí)類別
Category theThirdCate = GetCategories().Where(c => c.Id == theThirdInt).FirstOrDefault();
//獲取二級(jí)類別
Category theSecondCate = GetCategories().Where(c => c.Id == theThirdCate.ParentId).FirstOrDefault();
//獲取一級(jí)類別
Category theFirstCate = GetCategories().Where(c => c.Id == theSecondCate.ParentId).FirstOrDefault();
temp += i + "," + theSecondCate.Id.ToString() + "," + theFirstCate.Id.ToString() + ",";
}
//去掉最后一個(gè)英文逗號(hào)
temp = temp.Substring(0, temp.Length - 1);
//轉(zhuǎn)換成集合,去除重復(fù)項(xiàng),比如不同的三級(jí)可能有相同的一級(jí)或二級(jí)父類
IEnumerable<string> tempArray = temp.Split(',').AsEnumerable().Distinct();
//所有一級(jí)、二級(jí)、三級(jí)拼接成以英文逗號(hào)隔開(kāi)的字符串,但已經(jīng)去除了重復(fù)的一級(jí)和二級(jí)
string tempagain = string.Empty;
//再次遍歷集合拼接成字符串
foreach (var s in tempArray)
{
tempagain += s + ",";
}
productWithThreeCate.AllCategoreis = tempagain.Substring(0, tempagain.Length - 1);
tempResult.Add(productWithThreeCate);
}
//遍歷臨時(shí)結(jié)果
foreach (var item in tempResult)
{
//把當(dāng)前包含一級(jí)、二級(jí)、三級(jí)的,以英文逗號(hào)隔開(kāi)的字符串split成數(shù)組
string[] itemArray = item.AllCategoreis.Split(',');
//把當(dāng)前查詢字符串split成數(shù)組
string[] queryArray = query.Split(',');
//如果queryArray的每一個(gè)元素都被包含在itemArray中,那就保存起來(lái)
if (queryArray.All(x => itemArray.Contains(x)) == true)
{
result.Add(item);
}
}
return result;
}
客戶端的調(diào)用如下:
List<ProductWithThreeCate> result = GetResultByQuery("2,5");
//遍歷最終的結(jié)果
foreach (var item in result)
{
Console.WriteLine(item.Name+ " " + item.AllCategoreis);
}
Console.ReadKey();
原文鏈接:https://www.cnblogs.com/darrenji/p/4267926.html
相關(guān)推薦
- 2022-04-18 騰訊im中調(diào)用 setMessageRead 會(huì)話列表中的未讀消息還在存在
- 2022-03-31 解決Android加殼過(guò)程中mprotect調(diào)用失敗的原因分析_Android
- 2023-02-26 pandas的apply函數(shù)用法詳解_python
- 2023-03-22 golang如何使用gomobile進(jìn)行Android開(kāi)發(fā)_Golang
- 2023-01-02 Python創(chuàng)建相同值數(shù)組/列表的兩種方法_python
- 2022-08-14 協(xié)同開(kāi)發(fā)巧用gitignore中間件避免網(wǎng)絡(luò)請(qǐng)求攜帶登錄信息_Golang
- 2022-06-29 Python容器類型轉(zhuǎn)換的3種方法實(shí)例_python
- 2022-04-08 Android統(tǒng)一依賴管理的三種方式總結(jié)_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支