c # содержит часть строки - PullRequest
8 голосов
/ 29 марта 2012

Итак, у меня есть список с Materiel-объектами.В Материале у меня 15 методов get и set.Я хочу создать метод поиска, который зацикливает все объекты в списке и все переменные в каждом объекте Materiel.Часть зацикливания достаточно проста, но я борюсь со строкой-содержит-часть.Поисковый термин может быть, например, "acto", и я должен получить хит "Трактор".Я пытался использовать класс string-Contains, но, насколько я могу понять, он проверяет только строку, начинающуюся с позиции 0. Таким образом, «Tra» получает удар, но не «acto».Есть ли какие-либо сборки в классах, или я должен сам их программировать?

Извините за плохое объяснение.

Мой код.Теперь я вижу, что получаю хиты для подстроки, но также и другие результаты:)

    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 ]

14 голосов
/ 29 марта 2012

"some string".Contains("str") вернет true, у вас есть проблемы с чувствительностью к регистру?

Если вы можете использовать это:(строка) ')

4 голосов
/ 29 марта 2012

Использование IndexOf

string searchWithinThis = "ABCDEFGHIJKLMNOP";
string searchForThis = "DEF";
int firstCharacter = searchWithinThis.IndexOf(searchForThis);

Console.WriteLine("First occurrence: {0}", firstCharacter);

если подстрока не найдена, возвращается -1. Очень полезно также знать, где находится строка.

3 голосов
/ 29 марта 2012

Что касается дерьма и хихиканья, я подумал, что это был хороший проект для перерыва на обед, чтобы найти простое, но «элегантное» решение вопроса (как я понял :)):

например.

// 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);

Выходы:

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

Код также поддерживает

  • регулярные выражения
  • любые типы свойств (например, обнуляемые DateTimes или вложенные классы)
  • показывает , свойство которого соответствует шаблону / подстроке

Наслаждайтесь:

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]));

            }
        }
    }
}
1 голос
/ 29 марта 2012
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);
    }
}
0 голосов
/ 29 марта 2012

Метод string.Contains ищет подстроку в любом месте строки.

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

Сравнение, однако, является чувствительным к регистру, поэтому вам может потребоваться преобразовать регистр, если вы хотите выполнить поиск по кейсу:

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

"Asdf".ToUpper().Contains("as".ToUpper()) --> True
0 голосов
/ 29 марта 2012
 Bool doesContain = "Tractor".Contains("acto");

IsContain будет истинным.

Содержит работы над коллекциями, и в этом случае я думаю строка рассматривается как коллекция символов.

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

...