То, как я использую LINQ, Содержит (строка []) вместо Содержит (представляют в виде строки)

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

94
задан Otiel 2 December 2011 в 18:46
поделиться

12 ответов

spoulson имеет его почти право, но необходимо создать List<string> от string[] сначала. На самом деле List<int> было бы лучше, если uid также int. List<T> поддержки Contains(). Выполнение uid.ToString().Contains(string[]) подразумевало бы, что uid как строка содержит все значения массива как подстрока??? Даже если бы Вы действительно писали дополнительный метод, то смысл его был бы неправильным.

[РЕДАКТИРОВАНИЕ]

, Если Вы не меняли его и записали его для string[], поскольку Mitch Wheat демонстрирует, тогда Вы просто были бы в состоянии пропустить шаг преобразования.

[ENDEDIT]

Здесь - то, что Вы хотите, если Вы не делаете дополнительного метода (если у Вас уже нет набора потенциала uids, поскольку ints - тогда просто используют List<int>() вместо этого). Это использует цепочечный синтаксис метода, который я думаю, является более чистым, и делает преобразование в интервал, чтобы гарантировать, что запрос может использоваться с большим количеством поставщиков.

var uids = arrayofuids.Select(id => int.Parse(id)).ToList();

var selected = table.Where(t => uids.Contains(t.uid));
79
ответ дан tvanfosson 24 November 2019 в 06:07
поделиться

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

string[] search = new string[] { "2", "3" };
var result = from x in xx where search.Contains(x.uid.ToString()) select x;

LINQ ведет себя довольно яркий здесь и преобразовывает его в хороший SQL-оператор:

sp_executesql N'SELECT [t0].[uid]
FROM [dbo].[xx] AS [t0]
WHERE (CONVERT(NVarChar,[t0].[uid]))
IN (@p0, @p1)',N'@p0 nvarchar(1),
@p1 nvarchar(1)',@p0=N'2',@p1=N'3'

, с которым basicly встраивает содержание 'поискового' массива в запрос SQL и делает фильтрацию 'В' ключевом слове в SQL.

0
ответ дан Gorkem Pacaci 24 November 2019 в 06:07
поделиться

Я полагаю, что Вы могли также сделать что-то вроде этого.

from xx in table
where (from yy in string[] 
       select yy).Contains(xx.uid.ToString())
select xx
1
ответ дан ctrlShiftBryan 24 November 2019 в 06:07
поделиться

Это - пример одного способа записать дополнительный метод (примечание: Я не использовал бы это для очень больших массивов; другая структура данных была бы более соответствующей...):

namespace StringExtensionMethods
{
    public static class StringExtension
    {
        public static bool Contains(this string[] stringarray, string pat)
        {
            bool result = false;

            foreach (string s in stringarray)
            {
                if (s == pat)
                {
                    result = true;
                    break;
                }
            }

            return result;
        }
    }
}
2
ответ дан Mitch Wheat 24 November 2019 в 06:07
поделиться

Как насчет:

from xx in table
where stringarray.Contains(xx.uid.ToString())
select xx
3
ответ дан spoulson 24 November 2019 в 06:07
поделиться

Попробуйте следующее.

string input = "someString";
string[] toSearchFor = GetSearchStrings();
var containsAll = toSearchFor.All(x => input.Contains(x));
18
ответ дан Greg 24 November 2019 в 06:07
поделиться

Если Вы действительно надеетесь копировать , Содержит , но для массива, здесь дополнительный метод и пример кода для использования:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ContainsAnyThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            string testValue = "123345789";

            //will print true
            Console.WriteLine(testValue.ContainsAny("123", "987", "554")); 

            //but so will this also print true
            Console.WriteLine(testValue.ContainsAny("1", "987", "554"));
            Console.ReadKey();

        }
    }

    public static class StringExtensions
    {
        public static bool ContainsAny(this string str, params string[] values)
        {
            if (!string.IsNullOrEmpty(str) || values.Length > 0)
            {
                foreach (string value in values)
                {
                    if(str.Contains(value))
                        return true;
                }
            }

            return false;
        }
    }
}
33
ответ дан Jason Jackson 24 November 2019 в 06:07
поделиться

Таким образом, я предполагаю правильно, что uid является Уникальным идентификатором (Гуид)? Это - просто пример возможного сценария, или Вы действительно пытаетесь найти гуид, который соответствует массиву строк?

, Если это верно, что можно хотеть действительно заново продумать этот целый подход, это походит на действительно плохую идею. Необходимо, вероятно, пытаться соответствовать Гуиду к Гуиду

Guid id = new Guid(uid);
var query = from xx in table
            where xx.uid == id
            select xx;

, я честно не могу вообразить сценарий, где соответствие использованию массива строк "содержит" к содержанию Гуида, была бы хорошая идея. С одной стороны, Содержит (), не гарантирует порядка чисел в Гуиде, таким образом, Вы могли потенциально соответствовать нескольким объектам. Не говоря уже о сравнении гуидов этим путем был бы путь медленнее, чем просто выполнение его непосредственно.

0
ответ дан justin.m.chase 24 November 2019 в 06:07
поделиться

Мне удалось найти решение, но не лучшее, поскольку для этого требуется использовать AsEnumerable (), который будет возвращать все результаты из БД, к счастью, у меня в таблице только 1к записей, поэтому это не совсем заметно, но вот оно.

var users = from u in (from u in ctx.Users
                       where u.Mod_Status != "D"
                       select u).AsEnumerable()
            where ar.All(n => u.FullName.IndexOf(n,
                        StringComparison.InvariantCultureIgnoreCase) >= 0)
            select u;

Мой исходный пост следует:

Как вы делаете обратное? я хочу сделайте что-нибудь вроде следующего в структура сущности.

 строка [] search = новая строка [] {"Джон", "Лань"};
var users = from u в ctx.Users
 из s в поиске
 где u.FullName.Contains (s)
 выберите u;

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

Я также пробовал

 var users = from u в ctx.Users select u;
foreach (строка s в поиске) {
 users = users.Where (u => u.FullName.Contains (s));
}

Эта версия находит только те, которые содержать последний элемент в поиске array.

0
ответ дан 24 November 2019 в 06:07
поделиться

Лучшее решение, которое я нашел, - это создать таблично-значимую функцию в SQL, которая выдает результаты, например ::

CREATE function [dbo].[getMatches](@textStr nvarchar(50)) returns @MatchTbl table(
Fullname nvarchar(50) null,
ID nvarchar(50) null
)
as begin
declare @SearchStr nvarchar(50);
set @SearchStr = '%' + @textStr + '%';
insert into @MatchTbl 
select (LName + ', ' + FName + ' ' + MName) AS FullName, ID = ID from employees where LName like @SearchStr;
return;
end

GO

select * from dbo.getMatches('j')

Затем вы просто перетаскиваете функцию в конструктор LINQ.dbml и вызываете ее, как и другие объекты. LINQ даже знает столбцы вашей хранимой функции. Я называю это так ::

Dim db As New NobleLINQ
Dim LNameSearch As String = txt_searchLName.Text
Dim hlink As HyperLink

For Each ee In db.getMatches(LNameSearch)
   hlink = New HyperLink With {.Text = ee.Fullname & "<br />", .NavigateUrl = "?ID=" & ee.ID}
   pnl_results.Controls.Add(hlink)
Next

Невероятно просто и действительно использует мощь SQL и LINQ в приложении... и вы, конечно, можете сгенерировать любую функцию, оцененную таблицей, которую захотите, для тех же эффектов!

0
ответ дан 24 November 2019 в 06:07
поделиться

Я считаю, что вы действительно хотите: давайте представим сценарий у вас есть две базы данных и у них есть таблица общих продуктов И вы хотите выбрать продукты из таблицы «A», которая имеет общий идентификатор с «B»

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

, пример из msdn: http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect1

int [] numbers = (0, 2, 4, 5, 6, 8, 9); int [] numbersB = (1, 3, 5, 7, 8); var = commonNumbers numbersA.Intersect (numbersB);

Я думаю, что то, что вам нужно, легко решить с помощью пересечения

0
ответ дан 24 November 2019 в 06:07
поделиться
string[] stringArray = {1,45,20,10};
from xx in table 
where stringArray.Contains(xx.uid.ToString()) 
select xx
-1
ответ дан 24 November 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: