लैम्बडा फ़ंक्शन घोषित करना और तुरंत कॉल करना संभव है:
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; }))();