Если еще заявление в Linq - PullRequest
1 голос
/ 31 мая 2011

У меня есть таблица данных, которая содержит следующие данные как

SrNo Roll  Name
1     1     XYZ
99    45    ABC
150   120   POQ
10    9     RTY

Я хочу узнать номер рулона и имя для диапазона srno по 0-100 и 100-200

Таким образом, вывод будет

// For the range 0-100
SrNo Roll  Name
1     1     XYZ
99    45    ABC
10    9     RTY

// & For 100-200
SrNo Roll  Name
150   120   POQ

Я пытаюсь реализовать через LINQ с оператором if-else.

Если что-нибудь еще, пожалуйста, предложите с LINQ !!

Ответы [ 5 ]

3 голосов
/ 31 мая 2011

Код:

var items = 
    new[]
    {
        new { SrNo = 1, Roll = 1, Name = "XYZ" },
        new { SrNo = 99, Roll = 45, Name = "ABC" },
        new { SrNo = 150, Roll = 120, Name = "POQ" },
        new { SrNo = 10, Roll = 9, Name = "RTY" }
    };

const int NumberOfItemsInRange = 100;

var ranges = items
    .GroupBy(arg => arg.SrNo / NumberOfItemsInRange)
    .Select(arg => new { RangeNumber = arg.Key, Items = arg.ToList() })
    .ToList();

foreach (var range in ranges)
{
    Console.WriteLine("Range {0}-{1}", range.RangeNumber * NumberOfItemsInRange, (range.RangeNumber + 1) * NumberOfItemsInRange);
    foreach (var item in range.Items)
        Console.WriteLine("{0,10} {1,10} {2,10}", item.SrNo, item.SrNo, item.Name);
}

Выход:

Range 0-100
         1          1        XYZ
        99         99        ABC
        10         10        RTY
Range 100-200
       150        150        POQ
2 голосов
/ 31 мая 2011

У Linq нет оператора if / else.Для вашего случая вам нужно использовать предложение where для фильтрации данных

public IEnumerable<SrObj> GetSrObj (int min, int max)
{
    return from d in data_source
           where d.SrNo >= min && d.SrNo <= max
           select d;
}

//get 0-100
GetSrObj (0,100)
//get 100 -200
GetSrObj (100,200)
//Get both ranges
GetSrObj (0,100).Union(GetSrObj (100,200))
1 голос
/ 31 мая 2011
var dt = new DataTable();
dt.Columns.Add(new DataColumn("SrNo", typeof (int)));
dt.Columns.Add(new DataColumn("Roll", typeof(int)));
dt.Columns.Add(new DataColumn("Name", typeof(string)));

dt.Rows.Add(1, 1, "XYZ");
dt.Rows.Add(99, 45, "ABC");
dt.Rows.Add(150, 120, "ROQ");
dt.Rows.Add(10, 9, "RTY");

var result1 = from r in dt.AsEnumerable()
              where r.Field<int>("Roll") >= 0 && r.Field<int>("Roll") <= 100
              select r;

var result2 = from r in dt.AsEnumerable()
              where r.Field<int>("Roll") >= 100 && r.Field<int>("Roll") <= 200
              select r;
1 голос
/ 31 мая 2011

Ваш вопрос звучит для меня так, будто вы хотите группировать данные по 100 с. Если это так, попробуйте следующий фрагмент кода:

// grouping by srno
var results = from row in table.AsEnumerable()
                let key = row.Field<int>("SrNo") / 100
                group row by key into rowgroups
                select rowgroups;

Это сгруппирует ваши строки в пакеты по полю SrNo. Проверка:

foreach (var rowgroup in results)
{
    Console.WriteLine("\nGroup {0}", rowgroup.Key);
    foreach (DataRow row in rowgroup)
    {
        Console.WriteLine("{0}\t{1}\t{2}", 
            row.Field<int>("SrNo"),
            row.Field<int>("Roll"),
            row.Field<string>("Name"));
    }
}
0 голосов
/ 31 мая 2011
var result = from p in table1 where p.srno<100&&p.srno>0 select p;

Не стесняйтесь менять номера и т. Д.

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