<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本篇是針對我在做專案過程中遇到的特定需求而做的一個Demo, 沒有很大的通用性,讀者酌情可繞行。
標題不能完全表達本意,確切的情景需要展開說。假設有三級分類,關於分類這樣設計:
public class Category { public int Id { get; set; } public string Name { get; set; } public int ParentId { get; set; } }
然後產品可以屬於多個分類,以下的Categories屬性值是以英文逗號隔開、由分類編號拼接而成的字串。
public class Product { public int Id { get; set; } public string Name { get; set; } public string Categories { get; set; } }
由於種種原因,Categories屬性值只是儲存了由第三級分類編號拼接而成的字串。
在前端,需要把分類作為查詢條件來查詢產品,可能只選擇一級分類,把一個數位字串(比如"1")傳送給伺服器端;可能同時選擇一級和二級分類,也把一個數位字串(比如"1,2")傳送給伺服器端;當然,也有可能同時選擇一級、二級和三級分類作為查詢條件(比如"1,2,3")。換句話說,如果諸如"1"或"1,2"或"1,2,3"這樣的查詢條件轉換成陣列後,如果陣列的每一個元素都被包含在Product的Categories屬性值轉換成的陣列中,那這個產品就符合搜尋條件。
簡單來說,是這樣:假設搜尋條件是"1,2",Product的Categories屬性值為"1,3,2,5",我們不是判斷"1,2"這個字串是否包含在"1,3,2,5"字串中,而是把"1,2"先split成陣列,叫做array1, 把"1,3,2,5"也split成陣列,叫做array2,最後判斷array1的每個元素是否都被包含在array2中。
還有一個問題需要解決:當前的Product的Categories屬性值只儲存了所有第三級分類編號拼接成的字串,而前端輸入的搜尋條件可能會包含一級分類或二級分類等,所以,我們需要把Product轉換一下,希望有一個類的某個屬性值能儲存由一級、二級、三級分類拼接而成的字串。
public class ProductWithThreeCate { public int Id { get; set; } public string Name { get; set; } public string AllCategoreis { get; set; } }
以上, AllCategoreis屬性值就用來儲存由一級、二級、三級分類拼接而成的字串。
有一個方法獲取所有分類:
static List<Category> GetCategories() { return new List<Category>() { new Category(){Id = 1, Name = "根", ParentId = -1}, new Category(){Id = 2, Name = "一級分類1",ParentId = 1}, new Category(){Id = 3, Name = "一級分類2", ParentId = 1}, new Category(){Id = 4, Name = "二級分類11",ParentId = 2}, new Category(){Id = 5, Name = "二級分類12",ParentId = 2}, new Category(){Id = 6, Name = "二級分類21",ParentId = 3}, new Category(){Id = 7, Name = "二級分類22",ParentId = 3}, new Category(){Id = 8, Name = "三級分類111",ParentId = 4}, new Category(){Id = 9, Name = "三級分類112",ParentId = 4}, new Category(){Id = 10, Name = "三級分類121",ParentId = 5}, new Category(){Id = 11, Name = "三級分類122",ParentId = 5}, new Category(){Id = 12, Name = "三級分類211",ParentId = 6}, new Category(){Id = 13, Name = "三級分類212",ParentId = 6}, new Category(){Id = 14, Name = "三級分類221",ParentId = 7} }; }
有一個方法獲取所有產品:
static List<Product> GetProducts() { return new List<Product>() { new Product(){Id = 1, Name = "產品1",Categories = "10,12"}, new Product(){Id = 2, Name = "產品2", Categories = "12,13"}, new Product(){Id = 3, Name = "產品3",Categories = "10,11,12"}, new Product(){Id = 4, Name = "產品4",Categories = "13,14"}, new Product(){Id = 5, Name = "產品5",Categories = "11,13,14"} }; }
接下來的方法是根據搜尋條件(比如是"1,2")來查詢滿足條件的ProductWithThreeCate集合,如下:
/// <summary> /// 獲取滿足某些條件的集合 /// </summary> /// <param name="query">以英文逗號隔開的字串,比如:2,5</param> /// <returns></returns> static List<ProductWithThreeCate> GetResultByQuery(string query) { //最終結果 List<ProductWithThreeCate> result = new List<ProductWithThreeCate>(); //臨時結果 此時ProductWithThreeCat的屬性AllCategoreis包含所有一級、二級、三級分類ID拼接成的字串 List<ProductWithThreeCate> tempResult = new List<ProductWithThreeCate>(); //獲取所有的產品 List<Product> allProducts = GetProducts(); //遍歷這些產品 foreach (var item in allProducts) { ProductWithThreeCate productWithThreeCate = new ProductWithThreeCate(); productWithThreeCate.Id = item.Id; productWithThreeCate.Name = item.Name; //所有一級、二級、三級拼接成以英文逗號隔開的字串 string temp = string.Empty; //當前產品只包含三級拼接成的、也是以英文隔開的字串,split成陣列 string[] theThirdCates = item.Categories.Split(','); //遍歷這些三級陣列 foreach (string i in theThirdCates) { //三級類別轉換成整型 int theThirdInt = int.Parse(i); //獲取三級類別 Category theThirdCate = GetCategories().Where(c => c.Id == theThirdInt).FirstOrDefault(); //獲取二級類別 Category theSecondCate = GetCategories().Where(c => c.Id == theThirdCate.ParentId).FirstOrDefault(); //獲取一級類別 Category theFirstCate = GetCategories().Where(c => c.Id == theSecondCate.ParentId).FirstOrDefault(); temp += i + "," + theSecondCate.Id.ToString() + "," + theFirstCate.Id.ToString() + ","; } //去掉最後一個英文逗號 temp = temp.Substring(0, temp.Length - 1); //轉換成集合,去除重複項,比如不同的三級可能有相同的一級或二級父類別 IEnumerable<string> tempArray = temp.Split(',').AsEnumerable().Distinct(); //所有一級、二級、三級拼接成以英文逗號隔開的字串,但已經去除了重複的一級和二級 string tempagain = string.Empty; //再次遍歷集合拼接成字串 foreach (var s in tempArray) { tempagain += s + ","; } productWithThreeCate.AllCategoreis = tempagain.Substring(0, tempagain.Length - 1); tempResult.Add(productWithThreeCate); } //遍歷臨時結果 foreach (var item in tempResult) { //把當前包含一級、二級、三級的,以英文逗號隔開的字串split成陣列 string[] itemArray = item.AllCategoreis.Split(','); //把當前查詢字串split成陣列 string[] queryArray = query.Split(','); //如果queryArray的每一個元素都被包含在itemArray中,那就儲存起來 if (queryArray.All(x => itemArray.Contains(x)) == true) { result.Add(item); } } return result; }
使用者端的呼叫如下:
List<ProductWithThreeCate> result = GetResultByQuery("2,5"); //遍歷最終的結果 foreach (var item in result) { Console.WriteLine(item.Name+ " " + item.AllCategoreis); } Console.ReadKey();
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對it145.com的支援。如果你想了解更多相關內容請檢視下面相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45