Linq选择身份证号码为字母数字的最高身份证号码
我有一个身份证号码以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。 –