Linq选择身份证号码为字母数字的最高身份证号码

问题描述:

我有一个身份证号码以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。 –

你可以做这样的事情:

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

感谢您的帮助,更要感谢您的自我解释意见 –

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

你必须更换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()); 

你可以尝试这样的

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将获得第一个值