как вызвать метод без return-типа в linq? - PullRequest
5 голосов
/ 27 декабря 2010

Мне нравится вызывать метод без возвращаемого типа в linq или в методах расширения в linq?Вот мой класс, у меня есть строка ситуации это

Class A
{
   int i;
   public int K
   {
     get { return i; }
     set { i = value; }
   }
   public void calculate(int z)
   {
     this.k=z;
   }
}

Я хотел бы сделать так

List<A> sam = new List<A>();
//add elements to this list
var c = sam.Select( s => s.calculate(4) );

только этот пример, я хотел бы сделать это для моих целей.

Ответы [ 5 ]

9 голосов
/ 27 декабря 2010

Вы должны использовать List<T>.ForEach здесь.

sam.ForEach(s => s.calculate(somenumber));

Я думаю, что вы используете .Select в своем вопросе, потому что вы хотите получить результаты (все экземпляры A послезвонит calculate).Вы можете получить их напрямую с помощью переменной sam.ForEach изменяет каждый элемент sam, и «изменения» применяются к самому списку.

6 голосов
/ 27 декабря 2010

Если вы имеете в виду, что вы хотите выполнить итерацию последовательности ( IEnumerable ) и вызвать для нее код, вы можете дополнить метод расширения действием, которое вызывается для каждого элемента в последовательности, например:

public static void ForEach<T>(this System.Collection.Generic.IEnumerable<T> list, System.Action<T> action)
{
    foreach (T item in list)
        action(item);
}

Это имеет смысл, если вы хотите вызвать маленькую логику (одну строку) без реализации блока foreach ():

public class MyClass
{
    public void DoSomethingInOneLine()
    {
        // do something
    }
}

public static void Test(System.Collections.Generic.IEnumerable<MyClass> list)
{
    list.ForEach(item => item.DoSomethingInOneLine());
}
4 голосов
/ 10 мая 2011

Если вам не нужен результат, вы можете заполнить результат случайным значением (например, false).

var c = sam.Select( s => {s.calculate(4); return false;} );
0 голосов
/ 23 января 2014

Используя это часто:

Общий подход:

from item in sequence

// wrapping statements with lambda
let @void = new Func<bool>(() => {
   // whatever you like..
   return true;
})()

select item

Если вы хотите назначить свойство (бонус: пример работы с HTTP-клиентом: -):

..
// inside fluent LINQ query
let client = new HttpClient()

// initialise property and discard result
let @discard = client.DefaultRequestHeaders.Authorization = new  AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("user:pass")))

// now work with initialised client according to your logic..
select client.GetAsync("url").Result.Content.ReadAsStringAsync().Result
0 голосов
/ 08 сентября 2011

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

это был мой звонок

// wont compile:
from ticket in actualTickets
group ticket by ticket.ID into ticketGroup
select AddToBasket( exhibition, ticketGroup.First(), ticketGroup.Count() );

Я не мог придумать вескую причину, чтобы заставить AddToBasket() вернуть что-либо, поэтому я рефакторинг:

var pendingOpperations = from ticket in actualTickets
                            group ticket by ticket.ID into ticketGroup
                            select new Action( () => AddToBasket( exhibition, ticketGroup.First(), ticketGroup.Count() ) );

foreach ( var action in pendingOpperations ) action.Invoke();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...