Make string comparison case-insensitive for .net winforms application [duplicate] - c#

This question already has answers here:
Case insensitive 'Contains(string)'
(29 answers)
C# Case insensitive string comparison [duplicate]
(3 answers)
Closed 10 months ago.
Need to have string comparison case insensitive for .net winforms application. It is not a problem when strings are compared in my code, but I need this everywhere.
For ex.: there is combobox with items populated from SQL data, where value member is uppercase string, but entity field bound to this combobox as value is allowed to have value (string) lowercase. Same for the rest elements.

You cannot change the default comparison for strings in .net. .net is a case sensitive language. It has specific methods for comparing strings using different levels of case sensitivity, but (thank goodness) no global setting.

You can use this:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
Or extension method:
public static class StringExtensions
{
public static bool Contains(this string source, string value, StringComparison compareMode)
{
if (string.IsNullOrEmpty(source))
return false;
return source.IndexOf(value, compareMode) >= 0;
}
}
and you can call it like this:
bool result = "This is a try".Contains("TRY",
StringComparison.InvariantCultureIgnoreCase);
Console.WriteLine(result);

Use
if (string1.ToLower().Equals(string2.ToLower()))
{
#something
}
without the code, there is no other advice i can offer you :/

Related

how to use Any(char.IsDigit) to extract the int value [duplicate]

This question already has answers here:
How can I parse the int from a String in C#?
(4 answers)
Closed 3 months ago.
I have this line of code
bool containsInt = "Sanjay 400".Any(char.IsDigit)
What I am trying to do is extract the 400 from the string but
Any(char.IsDigit)
only returns a true value. I am very new to coding and c# especially.
As you already found out, you cannot use Any for extraction.
You would need to use the Where method:
List<char> allInts = "Sanjay 400".Where(char.IsDigit).ToList();
The result will be a list containing all integers/digits from your string.
Ok if you are interested in the value as integer you would need to convert it again to a string and then into an integer. Fortunately string has a nice constructor for this.
char[] allIntCharsArray = "Sanjay 400".Where(char.IsDigit).ToArray();
int theValue = Convert.ToInt32(new string(allIntCharsArray));
If you are using .NET 5 or higher you could also use the new cool TryParse method without extra string conversion:
int.TryParse(allIntCharsArray, out int theValue);
int result = int.Parse(string.Concat("Sanjay 400".Where(char.IsDigit)));
Use the Regex
var containsInt = Convert.ToInt32(Regex.Replace(#"Sanjay 400", #"\D", ""));
Regular expressions allow you to take only numbers and convert them into integers.

Case Insensitive Interpretation C# [duplicate]

This question already has answers here:
How can I do a case insensitive string comparison?
(9 answers)
LINQ Contains Case Insensitive
(11 answers)
Closed 5 years ago.
I'm making a text game, and I have one method for getting the input from the player and another for processing that input. However, it only works if the player types the command all in lowercase. I want it to ignore case.
public string GetInput()
{
var Test = true;
while (Test)
{
response = Console.ReadLine();
if (validWords.Contains(response))
{
Test = false;
ProcessInput(response);
}
else
{
Console.WriteLine("I'm sorry, I do not understand.");
}
}
return response;
}
public void ProcessInput(string response)
{
switch (response)
{ //Switch statements for responses here
}
}
I've tried using a few other responses I've found here, but they all still only work with lowercase input(using LINQ, string.IndexOf/Equals/etc.). Ideas?
Use string comparer which ignores string case as second parameter for Contains method:
validWords.Contains(response, StringComparer.OrdinalIgnoreCase)
You can make every input you receive, Lower-Case, using ToLower().
Example:
string response = Console.ReadLine().ToLower();
You can add .ToLower() after the readline, as followed:
response = Console.ReadLine().ToLower();
Everything read in from the console will be in lowercase.
You can read more about the ToLower method in the MSDN documentation.
Furthermore, also see the following question if you expect input of certain cultures: string.ToLower() and string.ToLowerInvariant().
Change the text you have to lower using .ToLower().
You're currently using if (validWords.Contains(response)) to check whether the user's response is contained within your validWords list. (I'm assuming).
What you can do is use the following LINQ expression:
if (validWords.Where(w => w.ToUpper().Equals(response.ToUpper())).Count() == 1)
This validates against both upper case strings.

Converting VB6 Optional Parameter to C# [duplicate]

This question already has answers here:
How can you use optional parameters in C#?
(23 answers)
Closed 8 years ago.
I have a VB6 function that has an optional date interval parameter that I'm trying to convert to C#. I'm also not sure of the best way to handle this in code. Here is the VB function declaration:
Private Function ReplaceDateTextNonBinary(psTable as String, psColumn as String, psColumnOffSet as String, psDateFormat as String, Optional psInterval as String = "n")
This function uses the optional parameter in the following DateAdd method call.
DateTime = DateAdd(psInterval, oSQL.Value(psColumnOffset), Date$)
Here is how I was planning to convert the function declaration to C# using the params keyword.
private static bool ReplaceDateTextNonBinary(string psTable, string psColumn, string pColumnOffset, string psDateFormat, params string psInterval)
I think this would work but I'm don't know how to code this that would take any date interval as a string. I was thinking of using a switch...case statement but that didn't seem very elegant.
Any thoughts.
You can use an optional parameter in C# just like this:
private static bool ReplaceDateTextNonBinary(string psTable,
string psColumn,
string pColumnOffset,
string psDateFormat,
string psInterval = "n")
If the optional parameter isn't passed, it'll get the value "n". Note that optional parameters must be listed last in the method signature. Also note this is a C# 4.0 feature and won't work with earlier versions of C# (in which case, simple overloading is probably your best bet).
See: Named and Optional Arguments (C# Programming Guide)
The prior to 4.0 way to do it would be something like this:
private static bool ReplaceDateTextNonBinary(string psTable,
string psColumn,
string pColumnOffset,
string psDateFormat)
{
return ReplaceDateTextNonBinary(psTable,
psColumn,
pColumnOffset,
psDateFormat,
"n");
}
private static bool ReplaceDateTextNonBinary(string psTable,
string psColumn,
string pColumnOffset,
string psDateFormat,
string psInterval)
{
// your implementation here
}

C# If Equals Case insensitive [duplicate]

This question already has answers here:
Comparing two strings, ignoring case in C# [duplicate]
(8 answers)
Closed 9 years ago.
The following code will open up a Message Box containing the word "Fail".
Is there a way to make the if statement case insensitive, so that the if statement passes and opens a mbox containg "Pass" without converting the character/string to upper/lower case?
here is the code:
public partial class Form1 : Form
{
string one = "A";
string two = "a";
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (one == two)
{
MessageBox.Show("Pass");
}
else
{
MessageBox.Show("Fail");
}
}
}
Thanks in advance
You could use this
string.Equals(one, two, StringComparison.CurrentCultureIgnoreCase)
Your code would be
if (string.Equals(one, two, StringComparison.CurrentCultureIgnoreCase))
{
MessageBox.Show("Pass");
}
else
{
MessageBox.Show("Fail");
}
Using CurrentCultureIgnoreCase :
Compare strings using culture-sensitive sort rules, the current
culture, and ignoring the case of the strings being compared.
More info here
if (string.Equals(one, two, StringComparison.CurrentCultureIgnoreCase))
From MSDN:
StringComparer.CurrentCultureIgnoreCase Property
Gets a StringComparer object that performs case-insensitive string comparisons using the word comparison rules of the current culture.
Various options:
if (String.Compare(one, two, StringComparison.CurrentCultureIgnoreCase) == 0) {
// they are equal
}
Option 2:
if ((one ?? "").ToLower() == (two ?? "").ToLower())
// they are equal
}
There are tons of other options, but these should get you started!
NOTE - One thing people regularly forget with string comparisons is null values. Be sure to watch for null values however you do your comparison. The second option I presented does an excellent job of this.
Use a case insensitive string comparer:
if(StringComparer.OrdinalIgnoreCase.Equals(one, two))
You should also consider if this comparison needs to be done in the user's culture.
You should use .Equals() to compare strings. Then you can use StringComparison.OrdinalIgnoreCase as the third argument to ignore case.
You can as well use this
string one = "obi";
string two = "Obi";
if(one.Equals(two, StringComparison.OrdinalIgnoreCase))
{
/* Your code */
}
if(one.ToLower() == two.ToLower())
{
//Do stuff
}

Case Insensitive comparison in C# [duplicate]

This question already has answers here:
Case insensitive 'Contains(string)'
(29 answers)
Closed 9 years ago.
I am comparing two strings using following code
string1.Contains(string2)
but i am not getting results for case insensitive search. Moreover I cant use String.Compare coz i dont want to match the whole name as the name is very big.
My need is to have case insensitive search and the search text can be of any length which the String1 contains.
Eg Term************** is the name.
I enter "erm" in textbox den i get the result. but when i enter "term" i dont get any result.
Can anyone help me :)
Try this:
string.Equals("this will return true", "ThIs WiLL ReTurN TRue", StringComparison.CurrentCultureIgnoreCase)
Or, for contains:
if (string1.IndexOf(string2, StringComparison.CurrentCultureIgnoreCase) >= 0)
I prefer an extension method like this.
public static class StringExtensions
{
public static bool Contains(this string source, string value, StringComparison compareMode)
{
if (string.IsNullOrEmpty(source))
return false;
return source.IndexOf(value, compareMode) >= 0;
}
}
Notice that in this way you could avoid the costly transformation in upper or lower case.
You could call the extension using this syntax
bool result = "This is a try".Contains("TRY", StringComparison.InvariantCultureIgnoreCase);
Console.WriteLine(result);
Please note: the above extension (as true for every extension method) should be defined inside a non-nested, non-generic static class See MSDN Ref
Convert both strings to a same case, either upper or lower.
string1.ToUpper().Contains(string2.ToUpper());
Why not this:
if (string1.IndexOf(string2, StringComparison.OrdinalIgnoreCase) >= 0)
{
}
string1.ToUpperInvariant().Contains(string2.ToUpperInvariant());
You can either convert both strings to uppercase, or use regular expressions:
using System.Text.RegularExpressions;
class Program {
static void Main(string[] args) {
string string1 = "TermSomething";
string string2 = "term";
bool test1 = string1.ToUpperInvariant().Contains(string2.ToUpperInvariant());
bool test2 = Regex.IsMatch(string1, Regex.Escape(string2), RegexOptions.IgnoreCase);
}
}
Note that if you use regular expressions you should escape the search string, so that special regex characters are interpreted literally.
Regex.IsMatch(string1,string2,RegexOptions.IgnoreCase);
This returns boolean value.....

Categories