Вернуть точные результаты из LINQ Contains - PullRequest
0 голосов
/ 18 июня 2020

У меня таблица содержит пример столбца XYZ. Ниже в образце данных.

XYZ
-------
Sales,
Sales_units,
Sales_Units_Per,
ATL

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

string check="Sales_units,ATL";
var res = objlist.where(x=> check.Contains(x.XYZ)).ToList();

Это возвращает следующие значения:

Sales,
Sales_units,
ATL

Но мой результат должен быть таким: Sales_units, ATL

Может ли кто-нибудь помочь мне решить проблему.

Заранее спасибо .

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Ваша проблема здесь в том, что слово "Sales_units" на самом деле содержит "Sales". Похоже, что ваши данные позволят сначала разделить строку по отметкам ,, а затем посмотреть, равны ли подстроки, а не содержат ли они что-то.

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

Я взял на себя смелость написать версию с разделением строк. Я оставлю версию регулярного выражения на ваше усмотрение.

class Program
{

    class Ws {
        public string XYZ;
        public Ws(string xyz) { XYZ = xyz; } }

    static void ConsoleWrite(string name, IEnumerable<Ws> list) {
        Console.WriteLine(name);
        foreach (var item in list)
            Console.WriteLine($"  '{item.XYZ}'"); }

    static IEnumerable<Ws> Original(IEnumerable<Ws> objlist) {
        string check = "Sales_units,ATL";
        var res = objlist.Where(x => check.Contains(x.XYZ)).ToList();
        return res; }

    static IEnumerable<Ws> StringSplitVersion(IEnumerable<Ws> objlist) {
        string[] checks = "Sales_units,ATL".Split(',');
        return objlist.Where(x => checks.Any(c => c.Equals(x.XYZ))); }

    static void Main(string[] args) {
        var objlist = new List<Ws> { new Ws("Sales"), new Ws("Sales_units"), new Ws("Sales_Units_Per"), new Ws("ATL") };
        ConsoleWrite("original", Original(objlist));
        ConsoleWrite("stringsplit", StringSplitVersion(objlist)); }
}
0 голосов
/ 18 июня 2020

Попробуйте оператор соединения в LINQ. Ознакомьтесь с документацией для получения дополнительной информации.

    static void Main()
    {
        string check = "Sales_units,ATL";
        var checkList = check.Split(",");

        var objlist = new List<Columns>();

        var result = objlist.Join(checkList, c => c.XYZ, s => s, (c, s) => c);

    }

    class Columns
    {
        public string XYZ { get; set; }
    }
0 голосов
/ 18 июня 2020

попробуйте это -> var check = new string[] { "Sales_units", "ATL" };

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...