我有一個身份證號碼以MB(會員)或NM(非會員)開頭的ID列表。Linq選擇身份證號碼爲字母數字的最高身份證號碼
的ID會像MB-101或NM-108等...
我試圖選擇最高的ID開始MB,然後加1,然後保存回數據庫。保存很簡單,但我不知道如何查詢最高的會員或非會員ID並添加一個。任何幫助深表感謝
我有一個身份證號碼以MB(會員)或NM(非會員)開頭的ID列表。Linq選擇身份證號碼爲字母數字的最高身份證號碼
的ID會像MB-101或NM-108等...
我試圖選擇最高的ID開始MB,然後加1,然後保存回數據庫。保存很簡單,但我不知道如何查詢最高的會員或非會員ID並添加一個。任何幫助深表感謝
你可以做這樣的事情:
List<string> list = new List<string>() { "MB-101", "MB-102", "MB-103", "MB-104"};
var ids = list.Select(x =>Convert.ToInt32(x.Replace("MB-", "")));//convert all the number parts to integer
list[list.FindIndex(x => x == "MB-" + ids.Max().ToString())] = "MB-" + (ids.Max() + 1);//set the max number after adding one.
你可以做同樣的你的非會員ID。它是經過測試的代碼,它成功解決了您的問題。
希望它有幫助。
您錯過了以NM-開頭的ID。使用Substring更容易和更高效地刪除前3個字符。 –
請原諒我 - 她只要求MB ID ... –
感謝您的幫助,更要感謝您的自我解釋意見 –
您可以通過拆分列表如下圖所示得到最大ID:
var ids = yourList.Where(x => x.ID.StartsWith("MB-")).Select(x => new { ID = x.ID.Split('-')[1] }).ToList();
var maxIdValue = ids.Select(x => int.Parse(x.ID)).ToList().Max();
如果你想從兩個開始MB-和NB-最大ID比你可以刪除其中的條件之上。由此它將從MB-和NB-中獲取最大ID。繼將查詢比:
var ids = yourList.Select(x => new { ID = x.ID.Split('-')[1] }).ToList();
var maxIdValue = ids.Select(x => int.Parse(x.ID)).ToList().Max();
你必須更換MB或NM空做OrderByDescending你的清單,並從有序列表FirstOrDefault。請檢查下面的例子。
CODE:
List<string> list = new List<string>() { "MB-101", "MB-102", "MB-109", "MB-105", "NM-110"};
var maxMember = list.OrderByDescending(m=>Convert.ToInt16(m.Replace("MB-","").Replace("NM-",""))).ToList().FirstOrDefault();
Console.WriteLine(maxMember.ToString());
你可以嘗試這樣的
List<string> lststr = new List<string>() { "MB-101", "MB-103", "MB-102", "NM-108" };
var result = "MB-"+ lststr
.Where(x=>x.Contains("MB"))
.Select(x => Regex.Replace(x, @"[^\d]", ""))
.OrderByDescending(x=>x)
.FirstOrDefault();
它將返回MB-103
,因爲它首先檢查是否字符串包含MB
那麼它將與其他""
不是數字和取代一切OrderByDescending
它將按降序排列,這樣最高的值將在上面,最後FirstOrDefault
將獲得第一個值
這是你的數據庫,我想?標籤說實體框架。如果是這樣,我建議這是非常低效的設計,因爲你的SQL Server ID會自動增加並且可以很好地查詢。你會在另一列有MB或NM。也許你有一個很好的理由,但... –
爲了進一步闡明 - 你需要在SQL查詢部分之後,在C#中的內存中進行查詢。這就是爲什麼它沒有效率。 –
我同意這可能是無效的,但我繼承了系統。有一個ID字段,這個字段基本上給了他們一個像MB-103一樣的唯一成員ID。 –