Выберите Top (x), а x.Kind = "value" - PullRequest
1 голос
/ 29 апреля 2011

Как выбрать верхнюю часть списка, если элементы в верхней части списка имеют свойство с определенным значением.

Мне нужен оператор Linq, чтобы увидеть, что в нем есть разрывпоследовательность и единственное возвращают два верхних элемента.Проблема в том, что я не знаю точно, сколько элементов будет иметь правильное значение свойства.

Я работал над этой проблемой с LinqPad 4. Приведенный ниже код является копией и последним из LinqPad 4Результаты, "q", не должны содержать SomeData с EffectiveDate от 05.04.2011, потому что свойство Kind в hsc2 имеет значение "KindTwo".

Я пытаюсь найти значение, наиболее повторяющееся из значения "Добрый день », а затем возьмите только верхние записи, которые соответствуют этому значению, пока я не доберусь до записи, которая не соответствует этому значению.

void Main()
{
    var hsc1 = new SomeData {EffectiveDate = new DateTime(2011,4,5), Kind = "KindOne"};
    var hsc2 = new SomeData {EffectiveDate = new DateTime(2011,4,10), Kind = "KindTwo"};
    var hsc3 = new SomeData {EffectiveDate = new DateTime(2011,4,20), Kind = "KindOne"};
    var hsc4 = new SomeData {EffectiveDate = new DateTime(2011,4,25), Kind = "KindOne"};

    var all = new [] {hsc1, hsc2, hsc3, hsc4};

    var lastSomeData = all.OrderByDescending((x) => x.EffectiveDate).First();

    lastSomeData.Dump();

    var q = from h in all 
            where h.Kind == lastSomeData.Kind
            orderby h.EffectiveDate descending 
            select h;

    q.Dump();
}

// Define other methods and classes here
class SomeData
{
    public DateTime EffectiveDate {get;set;}
    public string Kind {get;set;}
}

Ответы [ 3 ]

4 голосов
/ 29 апреля 2011

Вы ищете метод TakeWhile

DateTime filterDate = new DateTime(2011, 4, 5);
var top = q.TakeWhile(x => (DateTime.Compare(x, filterDate) != 0));
1 голос
/ 29 апреля 2011

Это полностью работающее консольное приложение, которое делает то, что вы просили.Поскольку я не был первым, кто предложил использовать TakeWhile в этом вопросе, не помечайте мой ответ как принятый.

using System;
using System.Linq;
namespace stackoverflow.com_questions_5825629_select_topx_while_x_kind_value
{
    class Program
    {
        static void Main()
        {
            var hsc1 = new SomeData { EffectiveDate = new DateTime(2011, 4, 5), Kind = "KindOne" };
            var hsc2 = new SomeData { EffectiveDate = new DateTime(2011, 4, 10), Kind = "KindTwo" };
            var hsc3 = new SomeData { EffectiveDate = new DateTime(2011, 4, 20), Kind = "KindOne" };
            var hsc4 = new SomeData { EffectiveDate = new DateTime(2011, 4, 25), Kind = "KindOne" };

            var all = new[] { hsc1, hsc2, hsc3, hsc4 };

            var lastSomeData = all.OrderByDescending((x) => x.EffectiveDate).First();

            var q = (from h in all
                     orderby h.EffectiveDate descending
                     select h).TakeWhile(x => x.Kind == lastSomeData.Kind);

            var result = q.ToArray();

            foreach (var item in result)
                Console.WriteLine(item);
            Console.WriteLine("");
            Console.WriteLine("Press any key");
            Console.ReadKey();
        }

        // Define other methods and classes here
        class SomeData
        {
            public DateTime EffectiveDate { get; set; }
            public string Kind { get; set; }
            public override string ToString()
            {
                return string.Format(@"new SomeData {{ EffectiveDate = new DateTime({0}, {1}, {2}), Kind = ""{3}"" }};", EffectiveDate.Year, EffectiveDate.Month, EffectiveDate.Day, Kind);
            }
        }
    }
}
0 голосов
/ 29 апреля 2011

Почему бы и нет?При заказе по убыванию даты вы получите первый элемент 2011/4/25 и своего рода KindOne.Поскольку элемент с датой 2011/4/5 имеет вид KindOne, он будет включен в результат.

Если вы просто хотите получить подмножество, вы можете использовать расширение .Take (num)метод.

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