C # contains part of a string

So, I have a list with Materiel objects. At Materiel, I have 15 retrieval and recruitment methods. I want to build a search method that includes all the objects in the list and all the variables in each Materiel object. The looping part is quite simple, but I'm struggling with the string-contains-part. The search term may be, for example, "acto", and I have to get hit for "Tractor". I tried using the string-Contains class, but as far as I can understand, it only checks the string starting at position 0. Thus, "Tra" gets hit, but not "acto".

Is there an assembly in the classes, or should I program myself?

Sorry for the incorrect explanation.

My code. Now I see that I get hits for the substring, but also other results :)

protected void Button_search_Click(object sender, EventArgs e) { string searchTerm = TextBox1.Text.ToString().ToLower(); TableRow row; TableCell cell; int rowNumber = 1; foreach (Materiell mat in allItems) { if (searchTerm.Contains(mat.itemID.ToString().ToLower()) || searchTerm.Contains(mat.manufacturer.ToLower()) || searchTerm.Contains(mat.model.ToLower()) || searchTerm.Contains(mat.serialNo.ToLower()) || searchTerm.Contains(mat.dateProd.ToString().ToLower()) || searchTerm.Contains(mat.location.ToLower()) || searchTerm.Contains(mat.mainCategory.ToLower()) || searchTerm.Contains(mat.subCategory.ToLower()) || searchTerm.Contains(mat.dateAcquired.ToString().ToLower()) || searchTerm.Contains(mat.price.ToString().ToLower()) || searchTerm.Contains(mat.ownerID.ToString().ToLower()) || searchTerm.Contains(mat.extra.ToString().ToLower()) || searchTerm.Contains(mat.textComment.ToLower()) || searchTerm.Contains(mat.active.ToString().ToLower())) { row = new TableRow(); row.ID = "row" + rowNumber.ToString(); rowNumber++; cell = new TableCell(); cell.Text = "<a href=\"#\" class=\"opendiv\">" + mat.itemID.ToString() + "</a>"; row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.manufacturer.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.model.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.serialNo.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.dateProd.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.location.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.mainCategory.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.subCategory.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.dateAcquired.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.price.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.ownerID.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.extra.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.ownDefData.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.textComment.ToString(); row.Cells.Add(cell); cell = new TableCell(); cell.Text = mat.active.ToString(); row.Cells.Add(cell); Table1.Rows.Add(row); } } } 
+6
source share
6 answers

"some string".Contains("str") will return true, do you have any case sensitivity issues?

If so, you can use this:

 public static bool Contains(this string source, string toCheck, StringComparison comp) { return source.IndexOf(toCheck, comp) >= 0; } string title = "STRING"; bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase); 

(Adapted from Case Insensitive "Contains (string)" )

+11
source

Use IndexOf

 string searchWithinThis = "ABCDEFGHIJKLMNOP"; string searchForThis = "DEF"; int firstCharacter = searchWithinThis.IndexOf(searchForThis); Console.WriteLine("First occurrence: {0}", firstCharacter); 

If the substring is not found, it returns -1. This is very useful for finding out where the string is.

+3
source

For tricks and giggles, I thought it was a good lunch break project to come up with a simple but "elegant" solution to the question (as I understand it):

eg.

 // I made up a Material class for testing: public class Materiel { public string A { get; set; } public int B { get; set; } public DateTime? C { get; set; } public string D { get; set; } public Nested E { get; set; } } // [...] usage: foreach (var pattern in new[]{ "World" , "dick", "Dick", "ick", "2012", "Attach" }) Console.WriteLine("{0} records match '{1}'", Database.Search(pattern).Count(), pattern); 

Outputs:

 2 records match 'World' 1 records match 'dick' 1 records match 'Dick' 2 records match 'ick' 1 records match '2012' 2 records match 'Attach' 

Code also supports

  • regular expression matches
  • any property types (e.g. nullable DateTimes or nested classes)
  • shows which property matches pattern / substring

Enjoy:

 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; namespace AClient { public class Materiel { public string A { get; set; } public int B { get; set; } public DateTime? C { get; set; } public string D { get; set; } public Nested E { get; set; } } public struct Nested { public string Data { get; set; } public override string ToString() { return string.Format("Extra: {0}", Data); } } public static class FullText { public class PropMatched<T> { public PropertyInfo Property; public T Item; } public static IEnumerable<PropMatched<T> > ByProperty<T>(this IEnumerable<T> items, string substr) { return items.ByProperty(new Regex(Regex.Escape(substr), RegexOptions.IgnoreCase)); } public static IEnumerable<PropMatched<T> > ByProperty<T>(this IEnumerable<T> items, Regex pattern) { return items.Select(i => i.MatchingProperties(pattern)).Where(m => null != m); } public static IEnumerable<T> Search<T>(this IEnumerable<T> items, string substr) { return items.Search(new Regex(Regex.Escape(substr), RegexOptions.IgnoreCase)); } public static IEnumerable<T> Search<T>(this IEnumerable<T> items, Regex pattern) { return items.Where(i => null != i.MatchingProperties(pattern)); } public static PropMatched<T> MatchingProperties<T>(this T item, Regex pattern) { if (null == pattern || null == item) return null; var properties = item.GetType().GetProperties(BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Instance); var matches = from prop in properties let val = prop.GetGetMethod(true).Invoke(item, new object[]{}) where pattern.IsMatch((val??"").ToString()) select prop; var found = matches.FirstOrDefault(); return found == null ? null : new PropMatched<T> {Item = item, Property = found}; } } class Client { private static readonly IEnumerable<Materiel> Database = new List<Materiel> { new Materiel { A = "Hello", B = 1, C = null, D = "World", E = new Nested {Data = "Attachment"} }, new Materiel { A = "Transfigured", B = 2, C = null, D = "Nights", E = new Nested {Data = "Schoenberg"} }, new Materiel { A = "Moby", B = 3, C = null, D = "Dick", E = new Nested {Data = "Biographic"} }, new Materiel { A = "Prick", B = 4, C = DateTime.Today, D = "World", E = new Nested {Data = "Attachment"} }, new Materiel { A = "Oh Noes", B = 2, C = null, D = "Nights", E = new Nested {Data = "Schoenberg"} }, }; static void Main() { foreach (var pattern in new[]{ "World" , "dick", "Dick", "ick", "2012", "Attach" }) Console.WriteLine("{0} records match '{1}'", Database.Search(pattern).Count(), pattern); // regex sample: var regex = new Regex(@"N\w+s", RegexOptions.IgnoreCase); Console.WriteLine(@"{0} records match regular expression 'N\w+s'", Database.Search(regex).Count()); // with context info: foreach (var contextMatch in Database.ByProperty(regex)) { Console.WriteLine("1 match of regex in propery {0} with value '{1}'", contextMatch.Property.Name, contextMatch.Property.GetGetMethod().Invoke(contextMatch.Item, new object[0])); } } } } 
+2
source
 class SearchInString { static void Main() { string strn= "A great things are happen with great humans."; System.Console.WriteLine("'{0}'",strn); bool case1= strn.StartsWith("A great"); System.Console.WriteLine("starts with 'A great'? {0}", case1); bool case2= strn.StartsWith("A great", System.StringComparison.OrdinalIgnoreCase); System.Console.WriteLine("starts with 'A great'? {0} (ignoring case)", case2); bool case3= strn.EndsWith("."); System.Console.WriteLine("ends with '.'? {0}", case3); int start= strn.IndexOf("great"); int end= strn.LastIndexOf("great"); string strn2 = strn.Substring(start, end- start); System.Console.WriteLine("between two 'great' words: '{0}'", strn2); } } 
+1
source
  Bool doesContain = "Tractor".Contains("acto"); 

doesContain will be true.

Contains work on collections, in which case I think the string is treated as a set of characters.

http://msdn.microsoft.com/en-us/library/dy85x1sa.aspx

0
source

The string.Contains method string.Contains for a substring anywhere in a string.

 "asdf".Contains("as") --> True "asdf".Contains("sd") --> True "asdf".Contains("df") --> True "asdf".Contains("xy") --> False 

A comparison, however, makes sense, so you may need to convert case if you want to do an insesetive search:

 "Asdf".Contains("as") --> False "Asdf".Contains("As") --> True "Asdf".ToUpper().Contains("as".ToUpper()) --> True 
0
source

Source: https://habr.com/ru/post/911924/


All Articles