如何从List中过滤和删除仅包含数字的索引?

时间:2014-02-16 10:39:35

标签: c# list

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);
            }
        }

5 个答案:

答案 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]);
      }
    }
 }