2017-03-08 77 views
2

我有一個身份證號碼以MB(會員)或NM(非會員)開頭的ID列表。Linq選擇身份證號碼爲字母數字的最高身份證號碼

的ID會像MB-101或NM-108等...

我試圖選擇最高的ID開始MB,然後加1,然後保存回數據庫。保存很簡單,但我不知道如何查詢最高的會員或非會員ID並添加一個。任何幫助深表感謝

+1

這是你的數據庫,我想?標籤說實體框架。如果是這樣,我建議這是非常低效的設計,因爲你的SQL Server ID會自動增加並且可以很好地查詢。你會在另一列有MB或NM。也許你有一個很好的理由,但... –

+0

爲了進一步闡明 - 你需要在SQL查詢部分之後,在C#中的內存中進行查詢。這就是爲什麼它沒有效率。 –

+0

我同意這可能是無效的,但我繼承了系統。有一個ID字段,這個字段基本上給了他們一個像MB-103一樣的唯一成員ID。 –

回答

1

你可以做這樣的事情:

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。它是經過測試的代碼,它成功解決了您的問題。

希望它有幫助。

+0

您錯過了以NM-開頭的ID。使用Substring更容易和更高效地刪除前3個字符。 –

+0

請原諒我 - 她只要求MB ID ... –

+0

感謝您的幫助,更要感謝您的自我解釋意見 –

1

您可以通過拆分列表如下圖所示得到最大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(); 
0

你必須更換MBNM空做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()); 
1

你可以嘗試這樣的

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將獲得第一個值