2011-01-31 3 views
1

HI,Looping коллекцию, чтобы найти минимальную

У меня есть набор строк например "тест (9)" "тест (7)" "тест (5)" "тест (3)"

Я хочу, чтобы цикл использовал цикл foreach для итерации и поиска самого низкого числа. У меня есть регулярное выражение, чтобы извлечь номер из каждой строки ... Мне нужно пропустить все элементы (которые находятся в формате, как в моем пример выше) и найти самое низкое число ...?

foreach (SPListItem item in items) 

{ 

string item = (String)item["Title"]; 

string itemNumberString = Regex.Match(UniqueCounteryparty, @"\d+").Value; 


} 
+2

Ты вопрос существо ... –

+0

Рассматривали ли вы с помощью класса для хранения количества отдельно или это невозможно в вашем сценарии? – Tx3

ответ

3

Я инициализирует переменную «тест» ниже, используя синтаксис инициализации массива для демонстрационных целей, так как я предполагаю, что у вас есть коллекция уже заселен со строками вам нужно.

string[] tests = new string[] { "test(1)", "test(2)", "test(3)" }; 
    int minimum = int.MaxValue; 

    foreach(string test in tests) 
    { 
    int num = ExtractNumber(test); 
    if (num < minimum) 
     minimum = num; 
    } 

    //now you have minimum that hold the minimum; 

"ExtractNumber" ваша функция, которая извлекает номер из строки

+0

Это немного быстрее, чем ответ @ Jakub, потому что он избегает ненужных назначений. Мне также легче понять. –

+0

@ssg, да, это была точка по обоим пунктам. Мне нравится использование Math.Min, но если вы не знакомы с этой функцией, это не так читаемо. И, видя вопрос о ФП, я подумал, что лучше всего держать его просто. –

+0

@ssg - Я делаю * одно задание за элемент - Shiv делает * как минимум * по одному на элемент. Я бы не стал судить о производительности, так как вы не знаете, какие оптимизаторы придумают компилятор. Лучший способ - проверить его. –

5
int minValue = int.MaxValue; 

foreach(string s in strings) 
    minValue = Math.Min(minValue, ExtractNumberMethod(s)); 
+0

да ... это то, о чем просят ... –

+0

если строки («тест 10», «тест 8», «тест 11»), он скажет, что результат теста 11 является самым низким, когда на самом деле это тест 8 в коллекции – van

+0

@nav - Ваш метод номера извлечения может вернуться не так, как вы ожидаете, - отлаживайте его. –

0

Вы можете просто полагаться на методы библиотеки базовых классов:

Образец для иллюстрации два метода:

using System; 
using System.Text.RegularExpressions; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     private static void Method2(string[] strings) 
     { 
      int[] ints = new int[strings.Length]; 

      for (int i = 0; i < strings.Length; i++) 
      { 
       ints[i] = Extract(strings[i]); 
      } 

      Array.Sort<int>(ints); 

      foreach (int i in ints) 
      { 
       Console.WriteLine(i); 
      } 

      Console.WriteLine("The smallest is {0}", ints[0]); 
     } 

     private static void Method1(string[] strings) 
     { 
      List<int> result = new List<int>(); 
      foreach (string s in strings) 
      { 
       int value = Extract(s); 
       result.Add(value); 
      } 
      result.Sort(); 

      foreach (int i in result) 
      { 
       Console.WriteLine(i); 
      } 
      Console.WriteLine("The smallest is {0}", result[0]); 
     } 
     static void Main(string[] args) 
     { 
      string[] strings = new string[6]; 

      strings[0] = "test (9)"; 
      strings[1] = "test (4)"; 
      strings[2] = "test (7)"; 
      strings[3] = "test (1)"; 
      strings[4] = "test (2)"; 
      strings[5] = "test (8)"; 

      Console.WriteLine("\nMethod1 :"); 
      Method1(strings); 

      Console.WriteLine("\nMethod2 :"); 

      Method2(strings); 
      Console.ReadLine(); 
     } 

     private static int Extract(string s) 
     { 
      // simply extract the digits 
      return Convert.ToInt32(Regex.Match(s, @"\d+").Value); 
     } 
    } 
} 
Смежные вопросы