Code Rewite для кортежа и операторов if else с использованием LINQ - PullRequest
0 голосов
/ 27 августа 2018

В моем приложении на C # я использую linq. Мне нужна помощь, каков синтаксис для if-elseif- с использованием linq в одну строку. Данные, RangeDate являются входными данными. Вот код:

var Date1 = RangeData.ToList();
int record =0;
foreach (var tr in Date1)
{
    int id =0;
    if (tr.Item1 != null && tr.Item1.port != null)
    {
        id = tr.Item1.port.id;
    }
    else if (tr.Item2 != null && tr.Item2.port != null)
    {
        id = tr.Item2.port.id;
    }
    if (id >0)
    {
         if(Data.Trygetvalue(id, out cdat)
          { 
         // Do some operation. (var cdata = SumData(id, tr.item2.port.Date)
         record ++;
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Вы можете использовать следующий код:

var count = RangeData.Select(x => new { Id = x.Item1?.port?.id ?? x.Item2?.port?.id ?? 0, Item = x })
                     .Count(x =>
                     {
                         int? cdate = null; // change int to your desired type over here
                         if (x.Id > 0 && Data.Trygetvalue(x.Id, out cdat))
                         {
                             // Do some operation. (var cdata = SumData(x.Id, x.Item.Item2.port.Date)

                             return true;
                         }
                         return false;
                     });

Edit:

@ D Стэнли совершенно прав, LINQ здесь не тот инструмент. Вы можете рефакторинг нескольких бит вашего кода, хотя:

var Date1 = RangeData.ToList();
int record =0;
foreach (var tr in Date1)
{
    int? cdat = null; // change int to your desired type over here
    int id = tr.Item1?.port?.id ?? tr.Item2?.port?.id ?? 0;
    if (id >0 && Data.Trygetvalue(id, out cdat))
    { 
         // Do some operation. (var cdata = SumData(id, tr.Item2.port.Date)
         record ++;
    }
}
0 голосов
/ 28 августа 2018

Линк здесь не тот инструмент. Linq предназначен для преобразования или для запроса коллекции. Вы перебираете коллекцию и «делаете какую-то операцию». В зависимости от того, что это за операция, попытка вставить ее в оператор Linq будет труднее понять постороннему читателю, трудно отладить и сложно поддерживать.

Нет ничего плохого в том цикле, который у вас есть. Как вы можете судить по другим ответам, трудно втиснуть всю имеющуюся информацию в «однострочный» оператор просто для использования Linq.

0 голосов
/ 27 августа 2018

Я думаю, что ваш пример кода ложный, ваша переменная записи инициализируется в 0 в каждом цикле, так что приращение это бесполезно.

Я полагаю, что вы хотите посчитать в своем списке записи с идентификатором, вы можете достичь этого с помощью одного Count():

var record = Date1.Count(o => (o.Item1?.port?.id ?? o.Item2?.port?.id) > 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...