C# Linq选择ID为字母数字的最高ID

C# Linq选择ID为字母数字的最高ID,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个ID列表,其中成员的ID以MB开头,非成员的ID以NM开头 ID应该是MB-101或NM-108等 我正在尝试选择以MB开头的最高ID,然后添加1,然后保存回DB。保存很容易,但我不知道如何查询最高的成员或非成员ID并向其中添加一个。非常感谢您的帮助您可以这样做: List<string> list = new List<string>() { "MB-101", "MB-102", "MB-103", "MB-104"}; var ids = list.Sele

我有一个ID列表,其中成员的ID以MB开头,非成员的ID以NM开头

ID应该是MB-101或NM-108等


我正在尝试选择以MB开头的最高ID,然后添加1,然后保存回DB。保存很容易,但我不知道如何查询最高的成员或非成员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执行同样的操作。它是经过测试的代码,它成功地解决了您的问题


希望有帮助。

您可以通过如下方式拆分列表来获得最大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开始使用max id,则可以删除上面的where条件。这样,它将从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替换为空并从已排序的列表中获取FirstOrDefault来执行排序。请检查下面的示例

代码:

你可以这样试试

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,然后它将替换除数字和降序之外的所有内容。它将按降序进行排序,以便最高值位于顶部,最后FirstOrDefault将获得第一个值,我想这是在您的数据库上?标签上写着实体框架。如果是这样,我建议这是非常低效的设计,因为您的SQL Server ID将自动递增,并且可以很好地查询。您将在另一列中显示MB或NM。也许你有一个很好的理由…进一步澄清-你需要在SQL查询部分之后执行你想要的查询,所以在内存中,在C中。这就是为什么它不高效。我同意这可能不高效,但我继承了系统。有一个ID字段,这个字段基本上为他们提供了一个唯一的成员ID,如MB-103。好的,您可以规范化数据库。但除此之外,您需要在查询中使用.AsEnumerable,然后使用M Adeel Khalid在下面的答案中提供的代码进行选择。我认为SQL中没有任何东西可以做到这一点,所以EF的Linq到SQL转换也无法做到。如果表不是很大(最多几千个),那么在IEnumerable上执行内存中的Linq查询应该没问题。使用子字符串删除前3个字符更容易、更高效。感谢您的帮助,更感谢您的自解释性注释这是我完成的代码:List List=\u applicationRepository.GetMemberIDs;var id=list.Selectx=>Convert.ToInt32x.ReplaceNM-//将所有数字部分转换为整数application.SLicenseNo=NM-+ids.Max+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();