【问题标题】:Declaring variable in splitted string in c# and search the db row between those strings在 C# 中的拆分字符串中声明变量并搜索这些字符串之间的数据库行
【发布时间】:2016-07-07 15:30:49
【问题描述】:

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

因此,如果用户输入 C001-C010 之类的范围,则它应该搜索该 C001-C010 之间的 oracle db 中的所有行,这就是我的要求。

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

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

示例代码如下。

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

【问题讨论】:

  • 你的问题不清楚。要拆分字符串,您只需 var searchstrings = _search.MutlipleId.Split('-') 但您打算使用结果数组中的值搜索的内容未定义。请澄清您的问题。
  • 要补充@crunchy 所说的内容,我们还需要了解您正在搜索的领域。我目前看到的答案采用生成一组可能的字符串并搜索它们的方法;但是,如果可以将搜索字段作为整数进行搜索,则使用范围来产生大于/小于搜索会更有效。
  • 嗨@crunchy 已正确编辑问题,请您再次检查。

标签: c# asp.net asp.net-mvc linq


【解决方案1】:

如果 Id 是 CXXX 格式,那么你可以这样做:

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

【讨论】:

  • 这里 Id 是字符串,所以我不能使用逻辑运算符。对不起,现在我编辑了同样的问题,你能检查一下吗。
【解决方案2】:

不了解您的所有业务需求,您可以尝试以下方法:

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 . . .
    }
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这将在-位置拆分,创建2列onetwo,但它也会创建多行包含列中的第一个、第二个、第三个...字符,这不是所要求的。顺便说一句。您需要删除一个额外的右括号)
    【解决方案4】:

    我会将数据集转换为一个列表,这样我就可以使用开始和结束参数的索引。

            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
    

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

    【讨论】:

    • 这几乎是正确的想法,但要完美,需要按照您的建议进行一些修改。
    【解决方案5】:
    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      相关资源
      最近更新 更多