2014-02-16 1 views
2
private void FilterNumbers(List<string> numbers) 
{ 
    for (int i = 0; i < numbers.Count; i++) 
    { 
     if (numbers[i].Contains 
    } 
} 

Например, в индексе 0 я вижу: «6» В индексе 7 я вижу: «88»Как фильтровать и удалять индексы из списка, содержащие только числа?

Это индексирует я хочу, чтобы удалить из списка. Список - это смешанный текст и индекс чисел, которые содержат только числа! Я хочу удалить их.

Мой код не является полным. Как проверить, содержит ли индекс/с только числа?

EDIT **

Это то, что я сделал:

Сначала я создать оригинальный список:

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 переменный текст, являющийся списком, содержит в первых 6 индексах и последние 6 номеров индексов. «0» «6» «8»

Что я хотел сделать, это извлечь текст в каждом между двумя тегами:

Теперь я хочу, чтобы фильтровать числа, а его фильтрацию только 3 индексирование в начале и в конце.

EDIT *

Это где я вызвать метод фильтра:

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

ответ

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 

Update:

Решение Сонер Gö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

Вы можете фильтровать их с помощью LINQ. Возможно, что-то вроде этого:

private IList<string> FilterNumbers(List<string> numbers) { 
    return numbers.Where(x => !x.All(char.IsDigit)); 
} 
4

Возможно использование LINQ с List<T>.RemoveAt method;

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 namespace like;

using System.Linq; 
+0

Soner делает ваш код удаления, но только 3 индекса в начале списка и 3 индекса чисел в конце списка. Может быть, мне нужно сделать метод рекурсивным? – user3200169

+0

@ user3200169 Вы правы, потому что метод ['RemoveAt'] (http://msdn.microsoft.com/en-us/library/5cw9x18z.aspx) перенумерован для замены удаленного элемента. Из документации; ** Когда вы вызываете RemoveAt для удаления элемента, остальные элементы в списке перенумеровываются, чтобы заменить удаленный элемент. Например, если вы удаляете элемент в индексе 3, элемент в индексе 4 перемещается в позицию 3. ** Обновите мой ответ с помощью метода «Удалить». –

+0

Даже при использовании Remove все еще удаляет только 3 индекса в начале и 3 в конце. И есть 6 в начале и 6 в конце. – user3200169

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

Вы можете использовать стандартный способ, чтобы преобразовать строку в число с помощью int.TryParse(), который возвращает значение, возвращаемое, указывающее, удалось ли преобразование.

int num; 
if (int.TryParse(numbers[i], out num)) { } 

Таким образом, вы даже можете указать формат последовательности, которую вы хотите рассматривать как число! Проверьте, что он предлагает на MSDN.

+0

вам не хватает 'out' в TryParse. –

+0

@SudhakarTillapudi Ой. Спасибо. –

Смежные вопросы