private void FilterNumbers(List<string> numbers)
{
for (int i = 0; i < numbers.Count; i++)
{
if (numbers[i].Contains
}
}
例如在索引0中我看到:“6” 在索引7中,我看到:“88”
我要从List中删除此索引。 列表是仅包含数字的混合文本和数字索引!!我想删除它们。
我的代码不完整。如何检查索引是否仅包含数字?
编辑**
这就是我所做的:
首先我创建原始列表:
private void ExtractText(string filePath)
{
List<string> text = new List<string>();
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.OptionFixNestedTags = true;
htmlDoc.Load(filePath, System.Text.Encoding.GetEncoding(65001));
if (htmlDoc.DocumentNode != null)
{
var nodes = htmlDoc.DocumentNode.SelectNodes("//a/b");
foreach (var node in nodes)
{
text.Add(node.InnerText);
}
}
}
文件是:
client.Encoding = System.Text.Encoding.GetEncoding(1255);
page = client.DownloadString("http://rotter.net/scoopscache.html");
StreamWriter w = new StreamWriter(@"d:\rotterhtml\rotterscoops.html");
w.Write(page);
w.Close();
ExtractText(@"d:\rotterhtml\rotterscoops.html");
问题是,在ExtractText方法的最后,作为List的变量文本包含前6个索引和最后6个索引号。 “0”“6”“8”
我想要做的是在两个标签之间提取每个文本:
现在我想过滤数字,但它在开头和结尾只过滤了3个索引。
编辑*
这是我调用过滤方法的地方:
private void ExtractText(string filePath)
{
List<string> text = new List<string>();
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.OptionFixNestedTags = true;
htmlDoc.Load(filePath, System.Text.Encoding.GetEncoding(65001));
if (htmlDoc.DocumentNode != null)
{
var nodes = htmlDoc.DocumentNode.SelectNodes("//a/b");
foreach (var node in nodes)
{
text.Add(node.InnerText);
}
FilterNumbers(text);
}
}
答案 0 :(得分:4)
您可以使用LINQ过滤它们。也许是这样的:
private IList<string> FilterNumbers(List<string> numbers) {
return numbers.Where(x => !x.All(char.IsDigit));
}
答案 1 :(得分:4)
您可以使用List<T>.RemoveAt
method之类的LINQ
private void FilterNumbers(List<string> numbers)
{
for(int i = 0; i < numbers.Count; i++)
{
if(numbers[i].All(Char.IsDigit))
{
numbers.Remove(numbers[i]);
}
}
}
不要忘记添加System.Linq
名称空间;
using System.Linq;
答案 2 :(得分:3)
您可以使用标准方法将字符串转换为使用int.TryParse()
的数字,该字符将返回指示转换是否成功的返回值。
int num;
if (int.TryParse(numbers[i], out num)) { }
这样您甚至可以指定要作为数字考虑的序列格式!检查它在MSDN上提供的内容。
答案 3 :(得分:3)
一种可能性是使用int.TryParse method检查给定字符串是否可以解析(转换)为整数:
private List<string> filterNumbers(List<string> mix)
{
List<string> onlyStrings = new List<string>();
foreach (var itemToCheck in mix)
{
int number = 0;
if (!int.TryParse(itemToCheck, out number))
{
onlyStrings.Add(itemToCheck);
}
}
return onlyStrings;
}
然后你可以使用这样的函数:
var mix = new List<string> { "1", "a", "66", "b" };
var strings = filterNumbers(mix);
foreach (var s in strings)
{
Console.WriteLine(s);
}
输出结果为:
a
b
更新:
如果列表上的迭代与删除分开,SonerGönül的解决方案也将正常工作。这可以使用ToList
LINQ扩展方法来实现:
private void FilterNumbers(List<string> numbers)
{
// create a copy of the list,
// so that removal does not affect the iteration
foreach (var item in numbers.ToList())
{
if(item.All(Char.IsDigit))
{
numbers.Remove(item);
}
}
}
然后根据需要使用:
var mix = new List<string> { "1", "5", "bbb", "6", "ABC" };
FilterNumbers(mix);
foreach (var item in mix)
{
Console.WriteLine(item);
}
和预期的输出:
bbb
ABC
答案 4 :(得分:1)
您可以使用Int32.TryParse()方法。因为它会让你知道解析是否成功。
来自MSDN: Int32.TryParse()
将数字的字符串表示形式转换为32位有符号 整数当量。返回值表示是否进行操作 成功了。
试试这个:
private void FilterNumbers(List<string> numbers)
{
int number;
for (int i = 0; i < numbers.Count; i++)
{
if(Int32.TryParse(numbers[i],out number))
{
numbers.Remove(numbers[i]);
}
}
}