Есть ли способ оптимизировать foreach с помощью LINQ? - PullRequest
0 голосов
/ 26 мая 2011

Как проверить, что массив целых чисел содержит целочисленное значение.

Как мне это сделать в LiNQ.Я должен сделать это в LINQ Query ..

Как: -

   Int test = 10;
var a = from test in Test
        where test.Contains(1,2,3,4,5,6,7,8,9,10)
    select test.id

В настоящее время я делаю это через метод расширений, но метод медленный.

public static bool ContainsAnyInt(this int int_, bool checkForNotContain_, params int[] values_)
    {
    try
            {
                if (values_.Length > 0)
                {
                    foreach (int value in values_)
                    {
                        if (value == int_)
                        {
                            if (checkForNotContain_)
                                return false;
                            else
                                return true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ApplicationLog.Log("Exception:  ExtensionsMerhod - ContainsAnyInt() Method ---> " + ex);
            }
}

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

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Не работает ли следующее (не проверено):

public static bool ContainsAnyInt(this int int_, bool checkForNotContain_, params int[] values_)
{
    if(values_ != null && values_.Contains(int_))
    {
       return !checkForNotContain_;
    }
    else
       return false;
}
1 голос
/ 26 мая 2011

Работая в рамках ваших ограничений, я бы отсортировал массивы значений в каждом из тестовых классов, чтобы вы могли сделать что-то вроде:

int[] values = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var results = from test in tests
              where test.BinaryContains(values)
              select test.id;

И тестовый класс будет выглядеть примерно так:

class Test
{
    public int id;
    public int[] vals; //A SORTED list of integers

    public bool BinaryContains(int[] values)
    {
        for (int i = 0; i < values.Length; i++)
            if (values[i] >= vals[0] && values[i] <= vals[vals.Length])
            {
                //Binary search vals for values[i]
                //if match found return true
            }
        return false;
    }
}

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

1 голос
/ 26 мая 2011

В большинстве случаев Linq медленнее, чем foreach.

Вы можете просто вызвать метод Linq Extension:

int[] values = new[]{3,3};
bool hasValue = values.Contains(3);

Он выполняет то же самое, что и ваш метод расширения.

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