如何从字符串中获取索引
How to get the index out from the string
我有一些字符串,我想从中获取索引号。
这是例子。
var x = "FundList[10].Amount";
var y = "FundList[11].Amount";
var z = "FundList[15].Amount";
我只是想获取 10,11,15 并将它们放入一个 Int 数组中。
目前我使用的是一种笨办法,就是将“FundList[”、“]”和“.Amout”替换为“”。
我想知道是否有更好的方法。
更新
这里有一些说明。这是我的代码。
这是我的 PartialView 的一部分。
@{
var txtIndexName = "FundList[" + Model.Index + "].Index";
var txtAmountName = "FundList[" + Model.Index + "].Amount";
var dropFiscalYearName = "FundList[" + Model.Index + "].FiscalYear";
}
Amount: <input type="text" name="@txtAmountName" id="@txtAmountName" />
这里是JavaScript调用PartialView。每次用户单击锚链接时,将调用 PartialView。
function LoadContractOptionFundingPlanBlockByIndexNumber(indexNumber) {
$.ajax({
type: "POST",
url: "/Json/LoadContractOptionFundingPlanPartialView",
data: JSON.stringify({ index: indexNumber }),
contentType: "application/json; charset=utf-8"
}).success(function (result) {
$("#ContractOptionFundingPlanBlock").append(result);
});
}
function GenerateOptionFundingPlanBlock() {
$("#lnkAddFundingBlock").click(function () {
LoadContractOptionFundingPlanBlockByIndexNumber(currentIndexNumber);
currentIndexNumber++;
});
}
$(document).ready(function () {
GenerateOptionFundingPlanBlock();
});
var currentIndexNumber = 10;
这是我的看法:
<form action="#" method="post" name="formCreateContracOption" id="formCreateContracOption">
@Html.AntiForgeryToken()
@Html.LabelForRequired(x=>x.ThisContractOption.OptionName)
@Html.ValidationMessageFor(x=>x.ThisContractOption.OptionName)
@Html.TextBoxFor(x=>x.ThisContractOption.OptionName) <br/><br/>
Period of Performance
@Html.TextBoxFor(x=>x.ThisContractOption.OptionStartDate)
@Html.TextBoxFor(x=>x.ThisContractOption.OptionEndDate) <br /><br />
<a id="lnkAddFundingBlock" href="#">Add Funding Plan</a> <br/><br/>
<div id="ContractOptionFundingPlanBlock"></div>
<input type="submit" id="btnCreateContractOption" name="btnCreateContractOption" value="Submit" />
</form>
毕竟,当用户单击“提交”按钮时,整个内容都会发布到控制器。
这是我的控制器。
[HttpPost]
public ActionResult CreateContractOption(int contractId, ContractOptionCreateEditViewModel viewModel, FormCollection form)
{
var fundList = new List<OptionFundingPlanObject>();
var allOptionAmountKeyList = form.AllKeys.Where(x => x.Contains("FundList") && x.Contains("Index")).ToList();
var indexNumberList = new List<int>();
foreach(var thisKey in allOptionAmountKeyList)
{
var convertedIndex = Convert.ToInt32(Regex.Match(thisKey, @"\d+").Value);
indexNumberList.Add(convertedIndex);
}
return View();
}
我问的原因是因为它不仅仅是一个如何 Post 列表到控制器的问题。
当 List 以零索引开始,并且每个其他索引都在一个序列中时,它很容易处理。
在我的例子中,用户可以通过调用我的局部视图来生成一个新的选项。用户将能够删除生成的选项,并创建一个新选项。然后索引发生了变化。既然如此,我只好另辟蹊径了。
var x = "FundList[10].Amount";
int xIndex = Convert.ToInt32(Regex.Match(x,@"\d+").Value); //10
虽然这是一个奇怪的问题。你在做什么? :)
可能是这样的:Online Demo
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
string text = "FundList[15].Amount";
var result = Convert.ToInt32(Regex.Replace(text, @"[^\d]+",""));
Console.WriteLine("Result is = {0}", result);
}
}
如果您总是要使用您提供的形式的字符串,您可以将其拆分在括号中并从返回的字符串数组中获取项目:
var x = "FundList[10].Amount";
var num = x.Split('[', ']')[1];
int res = Convert.ToInt32(num);
简单地固定为FundList
:
int i = int.Parse(x.Substring(9, x.IndexOf(']') - 9));
如果您更喜欢 LINQ 语法而不是 Regex:
var x = "FundList[10].Amount";
int n = Int32.Parse(new string(x.Where(c => Char.IsDigit(c)).ToArray())); //10
我有一些字符串,我想从中获取索引号。
这是例子。
var x = "FundList[10].Amount";
var y = "FundList[11].Amount";
var z = "FundList[15].Amount";
我只是想获取 10,11,15 并将它们放入一个 Int 数组中。
目前我使用的是一种笨办法,就是将“FundList[”、“]”和“.Amout”替换为“”。
我想知道是否有更好的方法。
更新
这里有一些说明。这是我的代码。
这是我的 PartialView 的一部分。
@{
var txtIndexName = "FundList[" + Model.Index + "].Index";
var txtAmountName = "FundList[" + Model.Index + "].Amount";
var dropFiscalYearName = "FundList[" + Model.Index + "].FiscalYear";
}
Amount: <input type="text" name="@txtAmountName" id="@txtAmountName" />
这里是JavaScript调用PartialView。每次用户单击锚链接时,将调用 PartialView。
function LoadContractOptionFundingPlanBlockByIndexNumber(indexNumber) {
$.ajax({
type: "POST",
url: "/Json/LoadContractOptionFundingPlanPartialView",
data: JSON.stringify({ index: indexNumber }),
contentType: "application/json; charset=utf-8"
}).success(function (result) {
$("#ContractOptionFundingPlanBlock").append(result);
});
}
function GenerateOptionFundingPlanBlock() {
$("#lnkAddFundingBlock").click(function () {
LoadContractOptionFundingPlanBlockByIndexNumber(currentIndexNumber);
currentIndexNumber++;
});
}
$(document).ready(function () {
GenerateOptionFundingPlanBlock();
});
var currentIndexNumber = 10;
这是我的看法:
<form action="#" method="post" name="formCreateContracOption" id="formCreateContracOption">
@Html.AntiForgeryToken()
@Html.LabelForRequired(x=>x.ThisContractOption.OptionName)
@Html.ValidationMessageFor(x=>x.ThisContractOption.OptionName)
@Html.TextBoxFor(x=>x.ThisContractOption.OptionName) <br/><br/>
Period of Performance
@Html.TextBoxFor(x=>x.ThisContractOption.OptionStartDate)
@Html.TextBoxFor(x=>x.ThisContractOption.OptionEndDate) <br /><br />
<a id="lnkAddFundingBlock" href="#">Add Funding Plan</a> <br/><br/>
<div id="ContractOptionFundingPlanBlock"></div>
<input type="submit" id="btnCreateContractOption" name="btnCreateContractOption" value="Submit" />
</form>
毕竟,当用户单击“提交”按钮时,整个内容都会发布到控制器。
这是我的控制器。
[HttpPost]
public ActionResult CreateContractOption(int contractId, ContractOptionCreateEditViewModel viewModel, FormCollection form)
{
var fundList = new List<OptionFundingPlanObject>();
var allOptionAmountKeyList = form.AllKeys.Where(x => x.Contains("FundList") && x.Contains("Index")).ToList();
var indexNumberList = new List<int>();
foreach(var thisKey in allOptionAmountKeyList)
{
var convertedIndex = Convert.ToInt32(Regex.Match(thisKey, @"\d+").Value);
indexNumberList.Add(convertedIndex);
}
return View();
}
我问的原因是因为它不仅仅是一个如何 Post 列表到控制器的问题。
当 List 以零索引开始,并且每个其他索引都在一个序列中时,它很容易处理。
在我的例子中,用户可以通过调用我的局部视图来生成一个新的选项。用户将能够删除生成的选项,并创建一个新选项。然后索引发生了变化。既然如此,我只好另辟蹊径了。
var x = "FundList[10].Amount";
int xIndex = Convert.ToInt32(Regex.Match(x,@"\d+").Value); //10
虽然这是一个奇怪的问题。你在做什么? :)
可能是这样的:Online Demo
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
string text = "FundList[15].Amount";
var result = Convert.ToInt32(Regex.Replace(text, @"[^\d]+",""));
Console.WriteLine("Result is = {0}", result);
}
}
如果您总是要使用您提供的形式的字符串,您可以将其拆分在括号中并从返回的字符串数组中获取项目:
var x = "FundList[10].Amount";
var num = x.Split('[', ']')[1];
int res = Convert.ToInt32(num);
简单地固定为FundList
:
int i = int.Parse(x.Substring(9, x.IndexOf(']') - 9));
如果您更喜欢 LINQ 语法而不是 Regex:
var x = "FundList[10].Amount";
int n = Int32.Parse(new string(x.Where(c => Char.IsDigit(c)).ToArray())); //10