2016-10-12 5 views
6

मेरे पास 2 सरणी हैं। ऐरे 1 एक स्ट्रिंग सरणी है जिसमें प्रकारों के नाम होते हैं।एफ # स्ट्रिंग्स की एक सरणी कास्टिंग टाइप करें

तो सरणी 1 की सामग्री को इस तरह दिखता है:

["nvarchar";"nvarchar";"date";"nvarchar"] //these are all strings 

सरणी 2 तार का एक और सरणी है और सामग्री को इस तरह दिखेगा:

["Jackson";"Sentzke";"1991-04-19T00:00:00";"Jackson Sentske"] 

मेरे समस्या यह है कि में सभी मान ऐरे 2 स्ट्रिंग्स हैं, और मैं उन्हें ऐरे 1 में टाइप करना चाहता हूं। क्या कोई तरीका है कि मैं ऐरे 2 में तारों का उपयोग करके ऐरे 2 में तारों को कास्ट कर सकता हूं?

+2

सबसे पहले, जाहिर है कि वे SQL कॉलम प्रकार हैं और .NET प्रकार नहीं हैं। दूसरा, आप वास्तव में विभिन्न प्रकार की एक सरणी नहीं कर सकते हैं। तीसरा, यही प्रदाता प्रदाता हैं, और एसक्यूएलप्रोवाइडर के पास निफ्टी है। मैपटो विधि जो यह करती है। आपको रिकॉर्ड की एक सरणी में इसे संग्रहीत करना चाहिए, और आपका जीवन बहुत आसान होगा। – s952163

उत्तर

6

@ s952163 बताते हैं, यह आप एक डेटाबेस से डेटा को पढ़ने के लिए जो मामले में वहाँ बेहतर विकल्प उपलब्ध यह अपने आप को ऐसा करने के लिए कोशिश कर रहा से कर रहे हैं प्रयास कर रहे हैं की तरह लग रहा है। फिर भी, ओपी को फेस वैल्यू पर ले जाने पर संभावित समाधान को स्केच करने के लिए, यहां इसके बारे में जाने का एक तरीका है।

सूचीबद्ध प्रकार के बाद से नेट प्रकार नहीं कर रहे हैं, शायद यह इस तरह मान धारण करने के लिए एक कस्टम प्रकार को परिभाषित करने के लिए बेहतर है:

open System 

type DbType = NVarChar of string | DT of DateTime 

आप DbType के लिए और अधिक मामलों में जोड़ सकते हैं यदि आप चाहें तो।

active patterns का उपयोग करना, आप एक ही उम्मीदवार कन्वर्ट करने के लिए एक समारोह लिख सकते हैं:

// string * string -> string option 
let (|NVarChar|_|) = function 
    | "nvarchar", (x : string) -> Some x 
    | _ -> None 

// string * string -> DateTime option 
let (|DT|_|) (typeHint, value) = 
    match (typeHint, DateTime.TryParse value) with 
    | "date", (true, dt) -> Some dt 
    | _ -> None 

// string * string -> DbType option  
let convertPair = function 
    | NVarChar x -> Some (NVarChar x) 
    | DT x -> Some (DT x) 
    | _ -> None 

सक्रिय पैटर्न का उपयोग सख्त आवश्यक नहीं है, लेकिन मैं इसे से मुझे एक अच्छा तरीका में समस्या विघटित करने के लिए सोचा ।

अब आप प्रकार की एक सूची और मूल्यों में से एक घोषणा कर सकते हैं उन्हें एक साथ ज़िप व्याख्या मानों की सूची प्राप्त करने के लिए:

> let types = ["nvarchar"; "nvarchar"; "date"; "nvarchar"];;  
val types : string list = ["nvarchar"; "nvarchar"; "date"; "nvarchar"] 

> let values = ["Jackson"; "Sentzke"; "1991-04-19T00:00:00"; "Jackson Sentske"];;  
val values : string list = 
    ["Jackson"; "Sentzke"; "1991-04-19T00:00:00"; "Jackson Sentske"] 

> let converted = List.zip types values |> List.choose convertPair;;  
val converted : DbType list = 
    [NVarChar "Jackson"; NVarChar "Sentzke"; DT 19.04.1991 00:00:00; 
    NVarChar "Jackson Sentske"] 

ध्यान दें कि types और values दोनों प्रकार string list है। ओपी में, वे (string * string * string * string) list थे, जो मुझे लगता है कि एक गलती थी।

+0

हां यह एक गलती थी। सुधार के लिए धन्यवाद। टिप्पणी के लिए भी धन्यवाद। यह किसी की मदद करेगा। मैंने सोचा कि यह मेरी मदद करेगा लेकिन मुझे एहसास हुआ कि मैं गलत सवाल पूछ रहा था। –

5

वास्तव में आपके यहां कुछ समस्याएं हैं।

अल्पविराम tuples बनाने के लिए अपने कोड

["nvarchar","nvarchar","date","nvarchar"] 

एक string list लेकिन (string * string * string * string) list

आप एक string list आप अर्धविराम ; का उपयोग करना होगा बनाना चाहते हैं नहीं है।

अब आप जो आपके कोड हमेशा सटीक प्रकार आप की तुलना में आप इसे इस

type RowItems = string * string * DateTime * string 
type Rows = RowItem list 

अब अगर आपकी समस्या को अलग अलग आकार और की पंक्तियों में शामिल की तरह कर सकता है चाहता हूँ के साथ टपल तत्वों का एक ही सटीक संख्या है पता है आप भेदभाव संघों का उपयोग कर एक दृष्टिकोण से संभवतः एसक्यूएल डेटा प्रकारों में कनवर्ट करना चाहते हैं।

type SQLDataType = 
    | VarChar of string 
    | Date of DateTime 

type Row = SQLDataType list 
type Rows = RowItem list 

उपयोग तो हो की तरह इस

let row = 
    [ 
     VarChar "Jackson"; 
     VarChar "Sentzke"; 
     Date DateTime.parse("1991-04-19T00:00:00"); 
     VarChar "Jackson Sentske" 
    ] 

अंत में आप फिर कुछ रूपांतरण कार्यों कि परिवर्तित लिखना चाहिए होता है कि से और अपने एसक्यूएल करने के लिए डेटा

let fromSQL (s:string) : SQLDataType = ... 
let toSQL (s:SQLDataType) : string = ... 

मुझे आशा है कि इस मदद करता है।

+0

टिप्पणी के लिए धन्यवाद। यह किसी की मदद करेगा। मैंने सोचा कि यह मेरी मदद करेगा लेकिन मुझे एहसास हुआ कि मैं गलत सवाल पूछ रहा था। –

1

यह एक निम्न-स्तरीय समाधान का थोड़ा सा है क्योंकि यह बहुत स्पष्ट नहीं है कि यह सब कहाँ चल रहा है, लेकिन अगर आपको केवल अपनी तारों के लिए डीबी प्रकारों की आवश्यकता है, तो टी-एसक्यूएल में Cast and Convert है और आपके लिए this भी। तो आप बस CAST ("1991-04-19T00:00:00" AS date) कह सकते हैं।

संबंधित मुद्दे