3

製品テーブルにdateSend列とdateEdit列があり、次のコードで最大dateSendを選択できます:

(from pro in Products.ToList()
select new { pro.DateSend }).Max();

しかし、dateSend と dateEdit の間に最大値があります。助けてください。

4

4 に答える 4

8
(from pro in Products.ToList()
let max = Max(pro.DateSend, pro.DateEdit)
select max).Max()


static DateTime? Max(DateTime? a, DateTime? b)
{
    if (!a.HasValue && !b.HasValue) return a;  // doesn't matter

    if (!a.HasValue) return b;  
    if (!b.HasValue) return a;

    return a.Value > b.Value ? a : b;
}
于 2013-03-27T21:25:50.493 に答える
7

クエリ構文を捨てることに反対しない場合は、次のようにする方が簡単です。

DateTime max = Products.Max(p=>p.DateSend > p.DateEdit ? p.DateSend : p.DateEdit);
于 2013-03-27T21:36:10.550 に答える
1
((from pro in Products.ToList()
select pro.DateSend).Union(
from pro2 in Products.ToList()
select pro.DateEdit
)).Max();
于 2013-03-27T21:25:30.690 に答える
0

同じコードですが、One LinQ を使用

   (From pro in Products.ToList
    Let max = {pro.DateSend, pro.DateEdit}.Max
    select max).Max

プロ アイテムが有効な DateTime でない場合、クラッシュするか、予期しない結果が返されます。

その他の解決策 (製品リスト項目の解析):

 (From pro in Products.ToList
    Let DSend as DateTime = Convert.ToDateTime(Iif(ValidDateTime(pro.DateSend), pro.DateSend, DateTime.MinValue))
    Let DEdit as DateTime = Convert.ToDateTime(Iif(ValidDateTime(pro.DateEdit), pro.DateEdit, DateTime.MinValue))
    Let MaxDate as DateTime= {DSend, DEdit}.Max
    select MaxDate).Max

private function ValidDateTime(ByVal Dat as Object) as Boolean
   if Dat Is Nothing OrElse IsDbNull(Dat) OrElse String.IsNullOrEmpty(Dat)  then
      return false
   end if

   return true
end function

ValidDateTime を「Iif」に置き換えることができます。

Double アイテムの最大値を返す他の例ですが、パーソナライズされたオブジェクト (MyObject) では、アイテムは String 型です。

  (From Item as MyObject in MyListOfObject
    Let Frec as Double = Convert.ToDouble(Iif(String.IsNullOrEmpty(Item.Frecuency),0,Item.Frecuency))
    Let Pot as Double = Convert.ToDouble(Iif(String.IsNullOrEmpty(Item.Power),0,Item.Power))
    Let max as Double= {Frec, Pot}.Max
    select max).Max

要約

  1. 列アイテムを個別に宣言します。解析します(必要な場合)
  2. 行(すべての列)の最大値を格納するためのアイテムを作成します
  3. 配列を作成し、宣言されたすべてのアイテムを入れて、配列を前に宣言されたアイテムに割り当てます(手順2で作成されたアイテム)
  4. 配列の最後に Max プロパティを次のように追加します: {Item1, Item2,...}.Max
  5. Select を作成して Max アイテムを返す
  6. 最後に linq Max プロパティを追加します。(MyLinQ).Max

このコードが誰かに役立つことを願っています。私の英語でごめんなさい。

于 2017-06-07T16:50:47.443 に答える