在 c# 中在拆分字符串中声明变量,并在这些字符串之间搜索 db 行

本文关键字:字符串 之间 搜索 db 拆分 声明 变量 | 更新日期: 2023-09-27 17:56:04

我有一个像搜索功能这样的要求,编辑:搜索就像一组varchars,通常此ID包含C001,C002等值,...

因此,如果用户输入 C001-C010

等范围,它应该搜索 oracle db 中 C001-C010 之间的所有行,这就是我的要求。

如果用户在文本框中输入某些范围(如 C001-C010),则应将其拆分为两个变量,并且应搜索此范围之间的所有元素。

如何做到这一点。我认为使用枚举器范围我们可以做到这一点,但我遇到了拆分字符串需要声明为单独变量并在两者之间进行搜索的问题。我无法实现。

示例代码如下。

            else if (!_search.MultipleId.Contains('-'))
            {
                filterExp = filterExp.And(x => x.Id.Contains(_search.MultipleId));
            }

在 c# 中在拆分字符串中声明变量,并在这些字符串之间搜索 db 行

如果 Id 的格式为 CXXX,那么您可以执行以下操作:

    if(_search.MultipleId.Contain("-"))
{
var range = _search.MultipleId.Split('-');
filterExp = filterExp.And(x => x.Id >= range[0] && x.Id <= range1);
}

不知道你们所有的业务需求,你可以尝试这样的事情:

class Program
{
    static void Main(string[] args)
    {
        var items = new List<string> { "C001", "C010" };
        var firstChar = new List<string>();
        var remainingChars = new List<string>();
        items.ForEach(i =>
        {
            firstChar.Add(i[0].ToString());
            remainingChars.Add(i.Substring(1));
        });
        firstChar.ForEach(f => { Console.Write(f + " "); });
        Console.WriteLine();
        remainingChars.ForEach(r => { Console.Write(r + " "); });
        Console.WriteLine();
        //Prints the following
        //C C
        //001 010
        //Press any key to continue . . .
    }
}

这样的事情可能会有所帮助:

var pair = yourstring.Split('-')
        .Select(a => new { one= a[0], two= a[1]});

我会将数据集强制转换为列表,以便我可以使用开始和结束参数的索引。

        var items = dataset.ToList();
        var searchString = "B1, C10";
        var removedWhitespace = Regex.Replace(searchString, @"'s+", "");
       var rangeToSearch = removedWhitespace.Split(',');
        var startPosition = items.FindIndex(x => x.ID == rangeToSearch.First());
        var endPosition = items.FindIndex(x => x.ID == rangeToSearch.Last());
        var selectedItems =
            items.Skip(startPosition).Take(endPosition - startPosition + 1); // +1 to include the original id's

如果必须,可以对列表进行排序,但此方法的一个警告是列表按字母顺序排序,因此您可能需要执行一些额外的处理以确保返回范围内的所有值。

public static HashSet<string> getIdsFromRangeQuery(string multipleIds)
{
multipleIds = multipleIds.ToUpper().Replace(" ", "");
HashSet<string> inSet = new HashSet<string>();
string[] parts = multipleIds.Split(new[] { ";" }, StringSplitOptions.None);
foreach (string part in parts)
{
    Regex rgx = new Regex(@"^M([0 - 9] +)C([0 - 9] +)$");
    Regex rgxTwo = new Regex(@"^M([0-9]+)C([0-9]+)-M([0-9]+)C([0-9]+)$");
    Regex rgxThree = new Regex(@"^[0-9]+$");
    Regex rgxFour = new Regex(@"^([0-9]+)-([0-9]+)$");
    if (rgx.IsMatch(part))
    {
        inSet.Add(part);
    }
    else if (rgxTwo.IsMatch(part))
    {
        string[] fromTo = part.Split(new[] { "-" }, StringSplitOptions.None);
        int mFrom = int.Parse(fromTo[0].Substring(1, fromTo[0].IndexOf("C")));
        int mTo = int.Parse(fromTo[1].Substring(1, fromTo[1].IndexOf("C")));
        int cFrom = int.Parse(fromTo[0].Substring(fromTo[0].LastIndexOf("C") + 1));
        int cTo = int.Parse(fromTo[1].Substring(fromTo[1].LastIndexOf("C") + 1));
        for (int i = mFrom; i <= mTo; i++)
        {
            for (int j = cFrom; j <= cTo; j++)
            {
                inSet.Add("M" + i + "C" + j);
            }
        }
    }
    else if (rgxThree.IsMatch(part))
    {
        inSet.Add(part);
    }
    else if (rgxFour.IsMatch(part)
    {
        string[] fromTo = part.Split(new[] { "-" }, StringSplitOptions.None);
        int from = int.Parse(fromTo[0]);
        int to = int.Parse(fromTo[1]);
        for (int i = from; i <= to; i++)
        {
            inSet.Add(i.ToString());
        }
    }
    else
    {
        inSet.Add(part);
    }
}
return inSet;
}