लैम्बडा फ़ंक्शन घोषित करना और तुरंत कॉल करना संभव है:
Func<int, int> lambda = (input) => { return 1; };
int output = lambda(0);
अगर एक लाइन में ऐसा करना संभव है तो मैं सोच रहा हूँ, जैसे कुछ
int output = (input) => { return 1; }(0);
जो संकलक त्रुटि "विधि नाम अपेक्षित" देता है। कास्टिंग Func<int, int>या तो काम नहीं करता है:
int output = (Func<int, int>)((input) => { return 1; })(0);
एक ही त्रुटि देता है, और नीचे बताए गए कारणों के लिए मैं इनपुट तर्क प्रकार (पहले int) को स्पष्ट रूप से निर्दिष्ट करने से बचना चाहता हूं ।
आप शायद सोच रहे हैं कि मैं ऐसा क्यों करना चाहता हूं, बजाय कोड को सीधे एम्बेड करने के, जैसे int output = 1;। कारण इस प्रकार है: मैंने SOAP webservice के लिए एक संदर्भ उत्पन्न किया है svcutil, जिसके कारण नेस्टेड तत्व बहुत लंबे वर्ग के नाम उत्पन्न करते हैं, जो मैं टाइप करने से बचना चाहता हूं। इसलिए इसके बजाय
var o = await client.GetOrderAsync(request);
return new Order {
OrderDate = o.OrderDate,
...
Shipments = o.Shipment_Order == null ? new Shipment[0]
o.Shipment_Order.Select(sh => new Shipment {
ShipmentID = sh.ShipmentID,
...
Address = CreateAddress(sh.ReceiverAddress_Shipment);
}).ToArray()
};
और एक अलग CreateAddress(GetOrderResultOrderShipment_OrderShipmentShipment_Address address)विधि (वास्तविक नाम और भी लंबे हैं, और मुझे फ़ॉर्म के बारे में बहुत सीमित नियंत्रण है), मैं लिखना चाहूंगा
var o = await client.GetOrderAsync(request);
return new Order {
OrderDate = o.OrderDate,
...
Shipments = o.Shipment_Order == null ? new Shipment[0]
o.Shipment_Order.Select(sh => new Shipment {
ShipmentID = sh.ShipmentID,
...
Address = sh.ReceiverAddress_Shipment == null ? null : () => {
var a = sh.ReceiverAddress_Shipment.Address;
return new Address {
Street = a.Street
...
};
}()
}).ToArray()
};
मुझे पता है कि मैं लिख सकता था
Address = sh.ReceiverAddress_Shipment == null ? null : new Address {
Street = sh.ReceiverAddress_Shipment.Address.Street,
...
}
लेकिन यह भी कि ( sh.ReceiverAddress_Shipment.Addressहिस्सा) बहुत दोहराव हो जाता है अगर कई क्षेत्र हैं। एक लंबोदर की घोषणा करना और तुरंत इसे कॉल करना अधिक सुरुचिपूर्ण कम वर्ण लिखने के लिए होगा।
public T Exec<T>(Func<T> func) => return func();और इसे इस तरह से उपयोग करें: int x = Exec(() => { return 1; });कि मुझे अपने सभी परगनों के साथ कास्टिंग की तुलना में बहुत अच्छे अच्छे पढ़ता है।
int output = ((Func<int>) (() => { return 1; }))();