2013-03-21 3 views
4

У меня есть две строкиОпределить, является ли строка больше другой строки

string A = "1.0.0.0"; 
string B = "1.0.0.1"; 

мне нужно как-то оценить, что B больше, чем A (версия мудры) либо преобразования этих двух строк в целые или десятичные дроби или что-то.

Я попробовал следующий

Decimal S = Convert.ToDecimal(A); 
int S = Convert.ToInt32(A); 

, но получаю следующее сообщение об ошибке, «Входная строка не была в правильном формате.»

Любая помощь будет оценена по достоинству.

+0

Вы работаете с IP-адресами? – RandomUs1r

+0

Я работаю над версиями, а не IP-адресами. – Butters

ответ

20

См. Version Class.

Вы в состоянии сделать что-то вроде этого:

Version a = new Version("1.0.0.0"); 
Version b = new Version("1.0.0.1"); 

if (b>a) //evaluates to true 
    blah blah blah 

Я лично не проверил это точный сценарий, но Version класс позволяет использовать операторы сравнения, как я показал здесь.

+0

Что будет работать, если строки имеют не более 4 числовых частей;) – Oded

+0

llya действительно прав, ничего более того, и вам, вероятно, придется настраивать код одного из решений String.Split, которые другие предложили , – tnw

+0

Это работало как шарм. Именно то, что я искал. Спасибо. Я уверен, что разделение строк также работает. – Butters

3

Если ваша строка имеет не более 4 числовых частей (разделенных .), вы можете использовать класс Version, чтобы получить строго типизированный объект, соответствующий этим строкам. Version реализует различные операторы сравнения (==, >, < ... и т.д.) в ожидаемом порядке, так что вы можете выяснить, что больше:

var a = new Version(A); 
var b = new Version(B); 

if(a > b) 
    // a is larger 
else if (a < b) 
    // b is larger 
else 
    // they are identical 

Если есть больше чем 4 части, то вам нужно разделите каждую строку на числовые компоненты, преобразуйте каждую из них в числовой эквивалент и сравните две результирующие коллекции.

Что-то вроде:

var aParts = A.Split('.'); 
var bParts = B.Split('.'); 

// assumes the string have the same number of parts 
for(int i = 0; i < aParts.Length; i++) 
{ 
    var currA = int.Parse(aParts[i]); 
    var currB = int.Parse(bParts[i]); 

    if(currA == currB) 
    continue; 

    if(currA > currB) 
    // A is greater than B  
    else 
    // B is greater than A 
} 
+0

не мой dv, но вы также должны сравнить длины. В настоящее время, если A длиннее B, ваш код бросает. – Servy

+0

@Servy - Да. Это цель комментария выше цикла for. – Oded

3

Вы можете взглянуть на System.Version класса. Если строки находятся в этом формате или могут быть преобразованы в версию.

Версия имеют компараторов

1

Если вы хотите сравнить версии строк в .NET, то вы можете использовать Version класс.

Version version = new Version("1.0.0.0"); 
Version otherVersion = new Version(""1.0.0.1"); 

Класс предоставляет операторам возможность проверить, является ли версия большей или меньшей, чем другая.

1

Разделить на ".". Затем преобразуйте каждую часть в int. Начиная с левой стороны: если фрагмент A ниже, сообщите, что A является первым. Если фрагмент B ниже, сообщите, что B - это первое. В противном случае перейдите к следующему фрагменту. Если вы уже в последнем фрагменте, сообщите, что они равны.

Если ваши строки имеют не более четырех частей (например, номера версий), то, как предложили другие, легче использовать класс System.Version.

-2

Вместо использования VersionClass быстрый подход будет примерно таким.

string A = "1.0.0.0"; 
string B = "1.0.0.1"; 

int versionA = Convert.ToInt32(A.Replace(".", string.Empty)); 
int versionB = Convert.ToInt32(B.Replace(".", string.Empty)); 

if (b>a) 
//something will happen here 

Заменить изменяет первую строку на второй в этом случае string.Empty равен «».

+3

wont work for: 1.0.256.0 и 2.0.0.0 – Mike

+0

, используя класс версии *, - это быстрый подход, и у него нет ужасной ошибки, которую только что указал Майк. –

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