Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / инициализация в if / 25 сообщений из 48, страница 1 из 2
06.12.2011, 14:00
    #37560950
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
допустим вот, если взять пример из мсдна:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var i = 5;

// s is compiled as a string
var s = "Hello";

// a is compiled as int[]
var a = new[] { 0, 1, 2 };

// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
    from c in customers
    where c.City == "London"
    select c;

// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };

// list is compiled as List<int>                             
var list = new List<int>();



а допустим, мне вот это:
var expr =
from c in customers
where c.City == "London"
select c;
нужно в иф засунутть., или в switch
получится что-то вроде
if(что-то там)
{
var expr =
from c in customers
where c.City == "London"
select c;
}
else
{
var expr =
from c in customers
where c.City == "Moscow"
select c;
}

Как мне сделать, чтобы "var expr" до ифа объявить?
...
Рейтинг: 0 / 0
06.12.2011, 14:50
    #37561066
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Никак.
...
Рейтинг: 0 / 0
06.12.2011, 14:53
    #37561074
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
А как тогда явно Ienumerable <T>?
Если например выражение возвращает интежер и стринг select new { type_int, type_string }
...
Рейтинг: 0 / 0
06.12.2011, 14:55
    #37561083
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Erik_KartmannА как тогда явно Ienumerable <T>?Да. Или IQueryable<T> если это LINQ-to-SQL.
Erik_KartmannЕсли например выражение возвращает интежер и стринг select new { type_int, type_string }От анонимных классов придётся отказаться.
...
Рейтинг: 0 / 0
06.12.2011, 15:05
    #37561107
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
авторОт анонимных классов придётся отказаться.
ну.. мне хотябы что-то вернуть надо, чтоб дальше хреначить.
...
Рейтинг: 0 / 0
06.12.2011, 21:09
    #37561853
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Алексей КНикак.
-1

Func<TSource, bool> predicate = d => ...
...
Рейтинг: 0 / 0
06.12.2011, 21:17
    #37561861
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Код: plaintext
1.
Func<TSource, bool> 


эта что?
...
Рейтинг: 0 / 0
06.12.2011, 21:21
    #37561871
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
делегат
...
Рейтинг: 0 / 0
06.12.2011, 21:28
    #37561887
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
А можно пример, как это применять? я не понял ничего.
...
Рейтинг: 0 / 0
06.12.2011, 21:37
    #37561901
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
http://msdn.microsoft.com/ru-ru/library/bb549151%28v=VS.90%29.aspx
и как это спасёт отца русской демократии?
...
Рейтинг: 0 / 0
07.12.2011, 06:43
    #37562239
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
МСУАлексей КНикак.
-1

Func<TSource, bool> predicate = d => ...Нужен пример кода с анонимным классом, решающий проблему ТС.
...
Рейтинг: 0 / 0
07.12.2011, 08:37
    #37562283
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Erik_KartmannА как тогда явно Ienumerable <T>?
Если например выражение возвращает интежер и стринг select new { type_int, type_string }
Я сделал так:
IEnumerable<result> ret;
а result - это класс, который содержит только
type_int, type_string . Без класса вообще можно явно определить эти инт и стринг?
...
Рейтинг: 0 / 0
07.12.2011, 08:40
    #37562284
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Erik_KartmannБез класса вообще можно явно определить эти инт и стринг?Собственно, создавая класс Вы явно определяете тип результата запроса.
...
Рейтинг: 0 / 0
07.12.2011, 08:41
    #37562287
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Та я знаю. Просто не понятно, всегда в таких случаях создавать класс?
...
Рейтинг: 0 / 0
07.12.2011, 08:43
    #37562288
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Erik_KartmannТа я знаю. Просто не понятно, всегда в таких случаях создавать класс?Как минимум в случаях, когда нельзя использовать анонимный класс. Если есть возможность использовать анонимный класс - явно описывать класс наверное не надо.
...
Рейтинг: 0 / 0
07.12.2011, 08:45
    #37562290
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
не.. ну-помоему это немного извращение . нет?
А Вы поняли, что имел в виду МСУ ?
...
Рейтинг: 0 / 0
07.12.2011, 08:55
    #37562300
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Erik_Kartmannне.. ну-помоему это немного извращение . нет?Я бы назвал это недостатком. Это, пожалуй, единственный недостаток LINQ по сравнению с SQL (не считая корявого left join) - нет возможности обращения к анонимным классам за пределами области видимости места, где он "сгенерирован". Надеюсь, авторы C# одумаются и добавят в будущем такую возможность.
Erik_KartmannА Вы поняли, что имел в виду МСУ ?Мне кажется, он не понял задачу. Или мы его не поняли. :-) Не будем гадать, подождём от него примера. :-)
...
Рейтинг: 0 / 0
07.12.2011, 09:05
    #37562308
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Алексей КНужен пример кода с анонимным классом, решающий проблему ТС.
Erik_Kartmann
Код: plaintext
1.
from c in customers


Алексей, хоть убейте, не вижу тут анонимного класса.

Erik_KartmannА Вы поняли, что имел в виду МСУ ?
Код: plaintext
1.
2.
3.
var items = Enumerable.Range(1, 100).Select(d => new Customer { Name = "Terry" + d, Age = d });
Func<Customer, bool> predicate = d => new Random().Next(0, 2) == 1 ? d.Age > 20 : d.Age > 50;
var filtered = items.Where(predicate);



Алексей КМне кажется, он не понял задачу. Или мы его не поняли. :-) Не будем гадать, подождём от него примера. :-)
Второе :)
...
Рейтинг: 0 / 0
07.12.2011, 09:18
    #37562322
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Алексей КНужен пример кода с анонимным классом, решающий проблему ТС.
Во-вторых, никто нам не запрещает создать свой предикат для анонимного класса. Вот пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
var items = Enumerable.Range(1, 100).Select(d => new { Name = "Terry" + d, Age = d });

var predicate = new Random().Next(0, 2) == 1 ? 
    new Predicate<int>(delegate(int age) { return age > 20; }) :
    new Predicate<int>(delegate(int age) { return age > 50; });

var filtered = items.Where(d => predicate(d.Age));



Леша, что скажете? :)
...
Рейтинг: 0 / 0
07.12.2011, 09:27
    #37562330
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
МСУЛеша, что скажете? :)
Соответственно, в количестве предикатов нас никто не ограничивает :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var items = Enumerable.Range(1, 100).Select(d => new { Name = "Terry" + d, Age = d });

bool condition = new Random().Next(0, 2) == 1;

var predicateName = condition ?
    new Predicate<string>(name => { return name.StartsWith("Terry1") || name.StartsWith("Terry2"); }) :
    new Predicate<string>(name => { return name.StartsWith("Terry3") || name.StartsWith("Terry4"); });

var predicateAge = condition ?
    new Predicate<int>(age => { return age > 20; }) :
    new Predicate<int>(age => { return age > 50; });

var filtered = items.Where(d => predicateName(d.Name) && predicateAge(d.Age));
...
Рейтинг: 0 / 0
07.12.2011, 09:48
    #37562365
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Добивая лопатой наших друзей из Новосибирска, хочется вспомнить про динамические предикаты, веяние 4-го фреймворка :)

Код: plaintext
1.
2.
3.
4.
5.
var items = Enumerable.Range(1, 100).Select(d => new { Name = "Terry" + d, Age = d });
Func<dynamic, bool> predicate = d => 
    condition ? d.Name.StartsWith("Terry1") && d.Age > 20 : 
    d.Name.StartsWith("Terry2") && d.Age > 50;
var filtered = items.Where(predicate);



P.S. Лично я не сторонник такого подхода, так как теряется контроль имен и контроль типов. Но зато имеем один единственный предикат, а не сотню.
...
Рейтинг: 0 / 0
07.12.2011, 10:05
    #37562395
Erik_Kartmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Код: plaintext
1.
var items = Enumerable.Range(1, 0).Select(d => new { пустое моё })


а без Ранге как можно ?
...
Рейтинг: 0 / 0
07.12.2011, 10:18
    #37562410
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
МСУАлексей КНужен пример кода с анонимным классом, решающий проблему ТС.
Во-вторых, никто нам не запрещает создать свой предикат для анонимного класса. Вот пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
var items = Enumerable.Range(1, 100).Select(d => new { Name = "Terry" + d, Age = d });

var predicate = new Random().Next(0, 2) == 1 ? 
    new Predicate<int>(delegate(int age) { return age > 20; }) :
    new Predicate<int>(delegate(int age) { return age > 50; });

var filtered = items.Where(d => predicate(d.Age));



Леша, что скажете? :)Не удовлетворяет условиям поставленной задачи. ТС хочет использовать анонимный класс за пределами области его видимости. В Вашем примере это не так.

ЗЫ: Я понимаю, что можно изменить постановку задачи и привести всё к какому-то такому виду.
...
Рейтинг: 0 / 0
07.12.2011, 10:19
    #37562412
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
МСУP.S. Лично я не сторонник такого подхода, так как теряется контроль имен и контроль типов. Но зато имеем один единственный предикат, а не сотню.Оно того не стоит.
...
Рейтинг: 0 / 0
07.12.2011, 10:22
    #37562420
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация в if
Erik_Kartmann
Код: plaintext
1.
var items = Enumerable.Range(1, 0).Select(d => new { пустое моё })


а без Ранге как можно ?

Чё? )

Алексей КНе удовлетворяет условиям поставленной задачи. ТС хочет использовать анонимный класс за пределами области его видимости. В Вашем примере это не так.
Вы так и не прокомментировали это:
МСУАлексей, хоть убейте, не вижу тут анонимного класса.
ТС работает с типизированной сущностью.

Во-вторых, где было сказано про "пределами области его видимости"?

Еще раз чистаем начальный вопрос:

Сабжист
Код: plaintext
1.
2.
3.
4.
var expr =
from c in customers
where c.City == "London"
select c;


нужно в иф засунутть., или в switch получится что-то вроде

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
if(что-то там)
{
var expr =
from c in customers
where c.City == "London"
select c;
}
else
{
var expr =
from c in customers
where c.City == "Moscow"
select c;
}


Как мне сделать, чтобы "var expr" до ифа объявить?
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / инициализация в if / 25 сообщений из 48, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]