2016-03-23 2 views
0

Я хочу сравнить 4 строки, если они равны или нет. Проблема в том, что я должен игнорировать пустые строки, , но если онивсепусто, тогда метод должен также возвращать true, потому что все пустые строки равны. Я мог бы написать все, какC# лучший способ сравнить 4 строки и игнорировать пустой

if(string1 != string.Empty && string2 != string.Empty && 
       string1 != string2) 
{ 
    return false 
} 
if(string1 != string.Empty && string2 != string.Empty && string3 != etc.... 

Но я думаю, что есть лучший способ, чтобы выписать все возможности. Но как?

+0

Сравнить 4 строки: как? Чтобы заказать их или посмотреть, равны ли они? – Richard

+0

Можете ли вы, пожалуйста, развернуть, но на что вы пытаетесь сделать? –

+0

Значит, все четыре должны быть равны или должны быть попарно равными? Кроме того, по крайней мере один элемент может быть пустым или вообще не включен? – HimBromBeere

ответ

3

Это будет проверять, что все непустые или непустые строки равны:

public static bool CheckNonEmptyStringsForEquality(params string[] strings) 
{ 
    string target = strings.FirstOrDefault(s => !string.IsNullOrEmpty(s)); 

    if (target == null) 
     return false; 

    return strings.All(s => string.IsNullOrEmpty(s) || s == target); 
} 

Используйте это так:

Console.WriteLine(
    CheckNonEmptyStringsForEquality("", "X", "X")); // Prints true 

Console.WriteLine(
    CheckNonEmptyStringsForEquality("", "X", "Y")); // Prints false 

Console.WriteLine(
    CheckNonEmptyStringsForEquality("", "X", "", "X", "", "X", "")); // Prints true 

Примечание: Если вы хотите вернуть истинный если все строки являются нулевыми или пустыми, сделайте это вместо этого:

public static bool CheckNonEmptyStringsForEquality(params string[] strings) 
{ 
    string target = strings.FirstOrDefault(s => !string.IsNullOrEmpty(s)); 
    return strings.All(s => string.IsNullOrEmpty(s) || s == target); 
} 

Тогда это будет возвращать тоже правда:

Console.WriteLine(
CheckNonEmptyStringsForEquality("", "", "")); // Prints true 
+0

did not work, я получаю false, когда массив содержит одну пустую строку, а остальные строки равны – Kimos

+0

@Kimos Отправьте код, который не работает, и я должен быть в состоянии объяснить, что вы сделали неправильно. Если вы посмотрите на первый пример использования, который я привел выше, вы можете увидеть, что он возвращает true, когда массив содержит одну пустую строку, а остальные строки равны. Код, который я разместил, определенно работает. –

+0

спасибо @Matthew Watson – Kimos

1

Что-то вроде этого? Сделайте Distinct и проверьте Count на массив строк.

var strings = new string[] {"str1", "str2", "str3"}; 

if((strings.Where(s=>!string.IsNullOrEmpty(s)).Distinct().Count() == 1)) 
{  
    // unique 
} 
+0

Вопрос не ясен, но я понимаю из примера, который мы ищем, если «любые 2 строки» равны, а не «все» являются equals (значение 'strings.Distinct(). Count() tafia

+0

Запрос верный, 'count' будет 1, если у нас есть одна и та же строка. –

+0

, так что я догадываюсь, что не понял вопрос – tafia

0

если передать строку в массиве,

var collection = new string[] { "India", "", "India", "India" }; 
var isEqual = collection.Distinct().Contains("") ? collection.Distinct().Count() <= 2 : collection.Distinct().Count() == 1; 
+0

это приведет к ложному, если все строки пустые, что неверно – Kimos

+0

Спасибо @Kimos. Теперь код возвращает true, даже если все строки пустые. –

1

Попробуйте это:

static void Main(string[] args) 
    { 
     var text1 = new[] { "x", "y", "z", "w" }; 
     var text2 = new[] { "x", "y", null, "" }; 
     var text3 = new[] { "x", "x", "x", "x" }; 
     var text4 = new[] { "x", "x", null, "" }; 

     MyComparer(text1); // False 
     MyComparer(text2); // False 
     MyComparer(text3); // True 
     MyComparer(text4); // True 
    } 

    private static bool MyComparer(IEnumerable<string> array) 
    { 
     return array.Where(t => !string.IsNullOrEmpty(t)).Distinct().Count() == 1; 
    } 
+0

отлично работает ... –

+0

var text5 = new [] {"", "", "", ""}; возвращает false, должно быть верно, все пустые строки являются euqal ... – Kimos

+0

Я не думаю, что в этом вопросе говорится, что он должен возвращать true или false. Если да, то это должно быть описано как таковое. – cani

0
 //Hope this helps 
     string a = ""; 
     string b = "mystring"; 
     string c = "mystring"; 
     string d = "mystring"; 
     bool isEqual = true; 
     ArrayList array = new ArrayList(); 
     array.Add(a); 
     array.Add(b); 
     array.Add(c); 
     array.Add(d); 


     foreach (string stringMemeber in array) 
     { 
      if (string.IsNullOrEmpty(stringMemeber)) 
      { 
       continue; 
      } 
      else 
      { 
       foreach (string NestedStringMember in array) 
       { 
        if (string.IsNullOrEmpty(NestedStringMember)) 
        { 
         continue; 
        } 
        else 
        { 
         if (string.Compare(stringMemeber,NestedStringMember)!=0) 
         { 
          isEqual = false; 
          break; 
         } 
        } 
       } 

       if (!isEqual) 
       { 
        break; 
       } 

      } 
     } 


     Console.WriteLine("The strings are equal: " + isEqual.ToString()); 
+0

Вы можете проверить равенство каждого элемента в массиве, используя один цикл. Нет необходимости во втором «foreach»: он просто делает дополнительную работу. – RoadieRich

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