পরিমাপের ইউনিটগুলিতে অ্যাক্সেসের জন্য ডেটা স্ট্রাকচার


17

টিএল; ডিআর - পরিমাপের একটি ইউনিটের মধ্যে ইউনিটগুলি সংজ্ঞায়িত করার জন্য আমি একটি সর্বোত্তম ডেটা স্ট্রাকচার ডিজাইন করার চেষ্টা করছি।


Unit of measureমূলত একটি value(বা পরিমাণ) এর সাথে যুক্ত unitএসআই ইউনিটগুলির সাতটি বেস বা মাত্রা রয়েছে। যথা: দৈর্ঘ্য, ভর, সময়, বৈদ্যুতিক বর্তমান, তাপমাত্রা, পদার্থের পরিমাণ (মোলস) এবং আলোকিত তীব্রতা।

এটি যথেষ্ট সহজবোধ্য হবে, তবে প্রচুর পরিমাণে উত্পন্ন ইউনিট রয়েছে পাশাপাশি হারগুলিও আমরা প্রায়শই ব্যবহার করি। একটি উদাহরণ সম্মিলিত ইউনিট হবে নিউটন: kg * m / s^2এবং উদাহরণের হার হবে tons / hr

আমাদের একটি অ্যাপ্লিকেশন রয়েছে যা অন্তর্ভুক্ত ইউনিটগুলির উপর খুব বেশি নির্ভর করে। আমরা ইউনিটগুলি ভেরিয়েবল বা কলাম নামের মধ্যে এম্বেড করব। যখন আমাদের বিভিন্ন ইউনিটের সাথে পরিমাপের একটি ইউনিট নির্দিষ্ট করতে হবে তখন এটি সমস্যা তৈরি করে। হ্যাঁ, আমরা ইনপুট এবং প্রদর্শনে মানগুলি রূপান্তর করতে পারি তবে এটি প্রচুর ওভারহেড কোড জেনারেট করে যা আমরা তার নিজস্ব বর্গের মধ্যেই encapsulate করতে চাই।

কোডেপ্লেক্স এবং অন্যান্য সহযোগী পরিবেশে বেশ কয়েকটি সমাধান রয়েছে। প্রকল্পগুলির লাইসেন্সিং সম্মত হলেও প্রকল্পটি সাধারণত নিজেই খুব স্বল্প ও ভারী হয়ে ওঠে। আমরা আমাদের নিজস্ব ইউনিকর্নের পিছনে তাড়া করছি "ঠিক ঠিক"।

আদর্শভাবে, আমি এই জাতীয় কিছু ব্যবহার করে পরিমাপের একটি নতুন ইউনিট সংজ্ঞায়িত করতে পারি:

UOM myUom1 = নতুন ইউওএম (10, ভোল্ট);
ইউওএম মাইউম 2 = নতুন ইউওএম (43.2, নিউটন);

অবশ্যই, আমরা আমাদের ক্লায়েন্টদের প্রয়োজনের ভিত্তিতে ইম্পেরিয়াল এবং এসআই ইউনিটগুলির মিশ্রণটি ব্যবহার করি।

আমাদের ইউনিটগুলির এই কাঠামোটি ভবিষ্যতের ডেটাবেস টেবিলের সাথে সুসংগত রাখতে হবে যাতে আমরা আমাদের ডেটাতেও একই ডিগ্রি ধারাবাহিকতা সরবরাহ করতে পারি।


আমাদের পরিমাপের ক্লাসের ইউনিট তৈরি করতে আমাদের প্রয়োজনীয় ইউনিটগুলি, উত্পন্ন ইউনিটগুলি এবং হারগুলি সংজ্ঞায়নের সর্বোত্তম উপায় কী? আমি এক বা একাধিক এনাম ব্যবহার করতে দেখতে পেলাম তবে এটি অন্যান্য বিকাশকারীদের জন্য হতাশার হতে পারে। একক এনাম ২০০+ এন্ট্রি সহ বিশাল হবে যেখানে একাধিক এনামগুলি এসআই বনাম ইম্পেরিয়াল ইউনিটগুলির উপর ভিত্তি করে বিভ্রান্তিকর হতে পারে এবং ইউনিটের নিজস্ব শ্রেণিবদ্ধকরণের ভিত্তিতে অতিরিক্ত ভাঙ্গন হতে পারে।

এনাম উদাহরণগুলি আমার কিছু উদ্বেগ দেখায়:

myUnits.Volt
myUnits.Newton
myUnits.meter

এসআইইউনিট.মিটার ইমম্পুনিট.ফুট
ড্রভডিউনিট. নিউট্রন
ড্রভডিউইনটিএসআই.নিউটন
ড্রাভিডিউনিটআইপি.ফিটএলবিএস

আমাদের ব্যবহৃত ইউনিটগুলির সেটটি বেশ ভাল সংজ্ঞায়িত এবং এটি একটি সীমাবদ্ধ স্থান। আমাদের যখন ক্লায়েন্টের চাহিদা থাকে তখন নতুন উত্পন্ন ইউনিট বা রেটগুলি প্রসারিত এবং যুক্ত করার সক্ষমতা আমাদের দরকার হয়। প্রকল্পটি সি # তে রয়েছে যদিও আমি মনে করি বিস্তৃত নকশাগুলি একাধিক ভাষার ক্ষেত্রে প্রযোজ্য।


আমি দেখেছি এমন একটি লাইব্রেরি স্ট্রিংয়ের মাধ্যমে ইউনিটগুলির ফ্রি-ফর্ম ইনপুট দেওয়ার অনুমতি দেয়। তাদের ইউওএম বর্গ তখন স্ট্রিংকে পার্স করে এবং সেই অনুযায়ী জিনিসগুলি স্লটেড করে। এই পদ্ধতির সাথে চ্যালেঞ্জটি হ'ল এটি বিকাশকারীকে সঠিক স্ট্রিং ফর্ম্যাটগুলি কী তা মনে করতে এবং মনে রাখতে বাধ্য করে। এবং আমি একটি রানটাইম ত্রুটি / ব্যতিক্রমের ঝুঁকিটি চালাই যদি আমরা কনস্ট্রাক্টরে স্ট্রিংগুলি পাস করার জন্য কোডের মধ্যে অতিরিক্ত চেক যোগ না করি।

অন্য একটি লাইব্রেরি মূলত অনেকগুলি ক্লাস তৈরি করেছে যা বিকাশকারীদের সাথে কাজ করতে হবে। সমতুল্য ইউওএম সহ এটি সরবরাহ করে একটিDerivedUnit এবং RateUnitইত্যাদি। মূলত, আমরা যে সমস্যার সমাধান করছি সেগুলির জন্য কোডটি অত্যধিক জটিল। এই লাইব্রেরিটি মূলত যে কোনওটিকে অনুমতি দেবে: যে কোনও সংমিশ্রণ (যা ইউনিট বিশ্বে বৈধ) তবে প্রতিটি সম্ভাব্য সংমিশ্রণকে মঞ্জুরি না দিয়ে আমরা আমাদের ইস্যুটি (আমাদের কোডটি সহজীকরণে) স্কোপ করে খুশি।

অন্যান্য গ্রন্থাগারগুলি হাস্যকরভাবে সহজ ছিল এবং উদাহরণস্বরূপ অপারেটরকে ওভারলোডিং বিবেচনা করে নি।

তদতিরিক্ত, আমি ভুল রূপান্তরগুলির প্রচেষ্টা সম্পর্কে উদ্বিগ্ন নই (উদাহরণস্বরূপ: ভোল্ট থেকে মিটার)। দেবগণই কেবলমাত্র এই পর্যায়ে এই স্তরে অ্যাক্সেস করবেন এবং আমাদের এই ধরণের ভুল থেকে রক্ষা করার প্রয়োজন নেই।


আপনি কীভাবে ব্যাখ্যা করতে পারেন যে আপনি যে লাইব্রেরিগুলি পেয়েছেন সেগুলি আপনার প্রয়োজনের সাথে খাপ খায় না?
সোভিক


1
@ মাইনমা ​​- এই লিঙ্কটির জন্য ধন্যবাদ। আমাদের মাত্রিক বিশ্লেষণ করার দরকার নেই কারণ আমাদের সমস্যার জায়গার পরিমাণ এত কম যে আমরা কেবলমাত্র অনুমোদিত রূপান্তরগুলি ঘোষণা করব। এটি উত্পাদনের জন্য স্লোগান হবে তবে এটি এক সময়ের ব্যয়।

1
আপনার কী ধরণের রূপান্তর প্রয়োজন তা আপনি ব্যাখ্যা করতে পারেন? এটি কি কেবল স্কেলিং রূপান্তর (যেমন মিটার থেকে সেন্টিমিটার) বা ক্রস-ডাইমেনশনাল রূপান্তরগুলি (যেমন ভর থেকে বল প্রয়োগ করা)?
বার্ট ভ্যান ইনজেন শেনৌ

1
আপনি কি কোডের অংশটি এফ # তে সরানোর কথা বিবেচনা করেছেন? এই ভাষার পরিমাপের বিল্ড ইন্টের একক রয়েছে।
পিট

উত্তর:


11

সি ++ এর জন্য বুস্ট গ্রন্থাগারগুলিতে মাত্রিক বিশ্লেষণে একটি নিবন্ধ অন্তর্ভুক্ত যা পরিমাপের ইউনিট পরিচালনা করার একটি নমুনা বাস্তবায়ন উপস্থাপন করে।

সংক্ষিপ্তসার হিসাবে: পরিমাপের ইউনিটগুলি ভেক্টর হিসাবে প্রতিনিধিত্ব করা হয়, ভেক্টরের প্রতিটি উপাদান একটি মৌলিক মাত্রা উপস্থাপন করে:

typedef int dimension[7]; // m  l  t  ...
dimension const mass      = {1, 0, 0, 0, 0, 0, 0};
dimension const length    = {0, 1, 0, 0, 0, 0, 0};
dimension const time      = {0, 0, 1, 0, 0, 0, 0};

উত্পন্ন ইউনিটগুলির সমন্বয় এটি are উদাহরণস্বরূপ, বল (ভর * দূরত্ব / সময় ^ 2) হিসাবে উপস্থাপিত হবে

dimension const force  = {1, 1, -2, 0, 0, 0, 0};

ইম্পেরিয়াল বনাম এসআই ইউনিটগুলি রূপান্তর ফ্যাক্টর যুক্ত করে পরিচালনা করা যেতে পারে।

এই প্রয়োগটি সি ++ - নির্দিষ্ট কৌশলগুলির উপর নির্ভর করে (বিভিন্ন পরিমাপের বিভিন্ন ইউনিটকে সহজেই বিভিন্ন সংকলন-সময়ের ধরণে রূপান্তর করতে টেমপ্লেট রূপক ব্যবহার করে), তবে ধারণাগুলি অন্যান্য প্রোগ্রামিং ভাষায় স্থানান্তরিত হওয়া উচিত।


সুতরাং প্রাপ্ত সমস্ত ইউনিট সি ++ কনসেটের সমতুল্য? আমি অনুমান করি যে তারা দূষিত জিনিস এড়ানোর জন্য একটি নেমস্পেসে জড়িয়ে আছে?

1
@ গ্লেনএইচ 7 - এটি টেমপ্লেট রূপক পদার্থে প্রবেশ করবে into এগুলি আসলে mpl::vector_c<int,1,0,0,0,0,0,0>কনস্টের পরিবর্তে পৃথক ধরণের (যেমন, ) হিসাবে উপস্থাপিত হয়; নিবন্ধটি ব্যাখ্যা দেওয়ার আগে প্রথমে কনস্টের পদ্ধতির উপস্থাপন করে (এবং আমি সম্ভবত এটি ভালভাবে ব্যাখ্যা করিনি)। কনসেটগুলি ব্যবহার করা বিকল্প হিসাবে কাজ করবে (আপনি কিছু সংকলন-টাইপ সুরক্ষা হারাবেন)। নাম দূষণ এড়াতে নেমস্পেস ব্যবহার করা অবশ্যই একটি বিকল্প।
জোশ কেলি

8

আমি শুধু Units.NET মুক্তি গিটহাব এবং এর NuGet

এটি আপনাকে সমস্ত সাধারণ ইউনিট এবং রূপান্তর দেয়। এটি হালকা ওজন, ইউনিট পরীক্ষিত এবং পিসিএল সমর্থন করে।

আপনার প্রশ্নের দিকে:

  • এটি বাস্তবায়নের হালকা প্রান্তে। ফোকাস হ'ল পরিমাপের ইউনিটগুলির দ্ব্যর্থহীন প্রতিনিধিত্ব, রূপান্তর এবং নির্মাণে সহায়তা করা।
  • কোনও সমীকরণ সমাধানকারী নেই, এটি গণনা থেকে স্বয়ংক্রিয়ভাবে নতুন ইউনিট প্রাপ্ত করে না।
  • সংজ্ঞা নির্ধারণের জন্য একটি বড় এনাম।
  • ইউনিটগুলির মধ্যে গতিময় রূপান্তরকরণের জন্য ইউনিটকনভার্টার শ্রেণি।
  • ইউনিটগুলির মধ্যে স্পষ্টত রূপান্তর করার জন্য অপরিবর্তনীয় ডেটা স্ট্রাকচার।
  • সাধারণ গাণিতিকের জন্য ওভারলোডেড অপারেটর।
  • নতুন ইউনিট এবং রূপান্তরগুলিতে প্রসারিত করা গতিশীল রূপান্তরকরণের জন্য একটি নতুন এনাম যুক্ত করা এবং স্পষ্ট রূপান্তর বৈশিষ্ট্য এবং অপারেটর ওভারলোডিং সংজ্ঞায়নের জন্য দৈর্ঘ্যের মতো পরিমাপ শ্রেণীর একটি ইউনিট যুক্ত করার বিষয়।

আমি এই ডোমেনে সমাধানের পবিত্র কচুকাটি এখনও দেখতে পাইনি। আপনার বক্তব্য হিসাবে, এটি সহজেই খুব জটিল বা কাজ করতে খুব ভার্জোজ হয়ে যেতে পারে। কখনও কখনও, জিনিসগুলি সহজ রাখা ভাল এবং আমার প্রয়োজনের জন্য এই পদ্ধতির যথেষ্ট প্রমাণিত হয়েছে।

সুস্পষ্ট রূপান্তর

Length meter = Length.FromMeters(1);
double cm = meter.Centimeters; // 100
double yards = meter.Yards; // 1.09361
double feet = meter.Feet; // 3.28084
double inches = meter.Inches; // 39.3701

Pressure p = Pressure.FromPascal(1);
double kpa = p.KiloPascals; // 1000
double bar = p.Bars; // 1 × 10-5
double atm = p.Atmosphere; // 9.86923267 × 10-6
double psi = p.Psi; // 1.45037738 × 10-4

গতিশীল রূপান্তর

// Explicitly
double m = UnitConverter.Convert(1, Unit.Kilometer, Unit.Meter); // 1000
double mi = UnitConverter.Convert(1, Unit.Kilometer, Unit.Mile); // 0.621371
double yds = UnitConverter.Convert(1, Unit.Meter, Unit.Yard); // 1.09361

// Or implicitly.
UnitValue val = GetUnknownValueAndUnit();

// Returns false if conversion was not possible.
double cm;
val.TryConvert(LengthUnit.Centimeter, out cm);

আপনার উদাহরণটি মূলত একটিTruple<T1, T2, T3>(x, y, z)
শেফ_কোড

আপনি কী বলতে চাইছেন তা নিশ্চিত নন, প্রতিটি ইউনিটের জন্য কেবলমাত্র একটি একক মান রয়েছে। দৈর্ঘ্যের জন্য এটি এক মিটার ক্ষেত্রের টাইপ ডাবল করে এবং ভর জন্য এটি কেজি। অন্যান্য ইউনিটে রূপান্তর করার সময় এটি রূপান্তর ফাংশনের মাধ্যমে সেই মানটি চালায়। এই নমুনাগুলি এখন কিছুটা পুরানো, তবে একই ধারণাটি প্রযোজ্য।
অ্যাঙ্গুলারসেন

আমি অনুমান করি যে আমি ভুল উচ্চারণ করেছি পাশাপাশি সিদ্ধান্তে ঝাঁপিয়ে পড়েছি ... আমি বলতে চাইছিলাম Tuple। আমি আপনার UnitConverterক্লাসটি দেখতে পাচ্ছি না , তবে আইএমও এটি বর্গের মতো একই কার্যকারিতা ভাগ করে নিতে পারে বলে মনে হচ্ছে Tuple
শেফ_কোড

টিপল তুলনা সম্পর্কে এখনও নিশ্চিত নয়, তবে ব্যবহারের আপডেট হওয়া উদাহরণগুলির জন্য গিথুব পৃষ্ঠাটি দেখুন ।
অ্যাঙ্গুলারসেন

3

আপনি যদি সি # ব্যবহারের পরিবর্তে এফ # তে স্যুইচ করতে পারেন তবে এফ # এর পরিমাপ পদ্ধতির একটি ইউনিট রয়েছে (মানগুলিতে মেটাডেটা ব্যবহার করে প্রয়োগ করা হয়েছে) যা দেখে মনে হচ্ছে আপনি যা করতে চেষ্টা করছেন তা এটি ফিটবে:

http://en.wikibooks.org/wiki/F_Sharp_Programming/Units_of_Measure

লক্ষণীয়ভাবে:

// Additionally, we can define types measures which are derived from existing measures as well:

[<Measure>] type m                  (* meter *)
[<Measure>] type s                  (* second *)
[<Measure>] type kg                 (* kilogram *)
[<Measure>] type N = (kg * m)/(s^2) (* Newtons *)
[<Measure>] type Pa = N/(m^2)       (* Pascals *)

ভাল পরামর্শ, এবং আমরা এটি বিবেচনা করেছি। আমি বিশ্বাস করি না যে F # আমাদের ইউনিটগুলি কীভাবে আউটপুট প্রদর্শিত হবে তা নিয়ন্ত্রণ করার ক্ষমতা দেয়।

2
@ GlenH7 আমি তোমাকে বিশ্বাস করি ডান:Important: Units of measure look like a data type, but they aren't. .NET's type system does not support the behaviors that units of measure have, such as being able to square, divide, or raise datatypes to powers. This functionality is provided by the F# static type checker at compile time, **but units are erased from compiled code**. Consequently, it is not possible to determine value's unit at runtime.
পল

3

সমস্ত প্রয়োজনীয় রূপান্তরগুলি স্কেলিং রূপান্তরকরণের ভিত্তিতে (যদি আপনি তাপমাত্রা রূপান্তরকে সমর্থন করতে চান তবে। যে রূপান্তরটিতে কোনও অফসেট জড়িত তা গণনাগুলি আরও জটিল হয়), আমি আমার 'পরিমাপের একক' সিস্টেমটি এইভাবে ডিজাইন করব:

  • unitএকটি স্কেলিং ফ্যাক্টর, ইউনিটের পাঠ্য উপস্থাপনের জন্য একটি স্ট্রিং এবং একটি রেফারেন্স যুক্ত একটি শ্রেণিunit স্কেলগুলি । পাঠ্য উপস্থাপনাটি প্রদর্শনের উদ্দেশ্যে এবং বিভিন্ন ইউনিটের সাথে মানগুলিতে গণিত করার সময় ফলাফলটি কোন ইউনিটে হয় তা জানতে বেস ইউনিটের রেফারেন্সের জন্য রয়েছে।

    প্রতিটি সমর্থিত ইউনিটের জন্য, unitশ্রেণীর একটি স্থির উদাহরণ সরবরাহ করা হয়।

  • UOMমান এবং মানগুলির একটি রেফারেন্স সহ একটি শ্রেণি unitUOMবর্গ যোগ / অন্য বিয়োগ জন্য ওভারলোড অপারেটার প্রদান করেUOM এবং গুন / একটি dimensionless মান বিভাজক জন্য।

    যদি সংযোজন / বিয়োগ দুটি UOMএকই সাথে সম্পাদিত হয় তবে unitএটি সরাসরি সম্পাদিত হয়। অন্যথায় উভয় মান তাদের নিজ নিজ বেস ইউনিটে রূপান্তরিত হয় এবং যুক্ত / বিয়োগফল হয়। ফলাফল বেসে ছিল বলে জানা গেছে unit

ব্যবহার মত হবে

unit volts = new unit(1, "V"); // base-unit is self
unit Newtons = new unit(1, "N"); // base-unit is self
unit kiloNewtons = new unit(1000, "kN", Newtons);
//...
UOM myUom1 = new UOM(10, volts);
UOM myUom2 = new UOM(43.2, kiloNewtons);

যেহেতু বেমানান ইউনিটগুলির ক্রিয়াকলাপগুলিকে কোনও সমস্যা হিসাবে বিবেচনা করা হয় না, তাই আমি সেই বিষয়ে নকশাকে টাইপ-নিরাপদ করার চেষ্টা করি নি। দুটি ইউনিট একই বেস ইউনিটকে উল্লেখ করে যাচাই করে একটি রানটাইম চেক যুক্ত করা সম্ভব।


আপনি যেহেতু তাপমাত্রা উল্লেখ করেছেন: কী 95F - 85F? কী 20C - 15C? উভয় উদাহরণে, উভয় UOMএর একই হবে unit। বিয়োগগুলি সরাসরি সঞ্চালিত হবে?

@ ম্যাটফেনউইক: ফলাফল যথাক্রমে হবে 10 Fএবং 5 C। অযৌক্তিক রূপান্তরগুলি এড়ানোর জন্য গণনাগুলি সরাসরি সম্ভব হলে সঞ্চালিত হয়। এতে ইউনিট-রূপান্তর পদ্ধতি যুক্ত করা মোটামুটি নগণ্য হবে UOM, তবে সেলসিয়াস-ফারেনহাইট রূপান্তরকরণের জন্য, unitএকটি স্কেলিং ফ্যাক্টর ছাড়াও অফসেটের সম্ভাবনা সহ শ্রেণিটি বাড়ানো হবে।
বার্ট ভ্যান ইনজেন শেহেনো

কিন্তু 95F - 85F! = 10F

1
@ ম্যাটফেনউইক: দয়া করে আমাকে আলোকিত করুন। যদি আপনি একটি তাপমাত্রা কমে কিভাবে ঠান্ডা পেতে পারি 95Fদ্বারা 85F? আমার জানা মতে, ফারেনহাইট এখনও লিনিয়ার স্কেল।
বার্ট ভ্যান ইনজেন শেহেনো

2
সেলসিয়াস উদাহরণটি করা যাক কারণ কেলভিনে রূপান্তর করা আরও সহজ: যদি আমরা বলি 20C - 15C = 5C, তবে আমরা বলছি 293.15K - 288.15K = 278.15K, যা স্পষ্টতই ভুল।

2

আপনার কোডটি কী করছে এবং এটি কী অনুমতি দেবে তা ভেবে দেখুন। এতে সমস্ত সম্ভাব্য ইউনিটগুলির সাথে একটি সহজ গণনা থাকা আমাকে ভোল্টকে মিটারে রূপান্তর করার মতো কিছু করতে দেয়। এটি অবশ্যই কোনও মানুষের কাছে বৈধ নয়, তবে সফ্টওয়্যারটি আনন্দের সাথে চেষ্টা করবে।

আমি একবার এর সাথে অস্পষ্টভাবে কিছু অনুরূপ করেছি এবং আমার বাস্তবায়নের বিমূর্ত বেস ক্লাসগুলি ছিল (দৈর্ঘ্য, ওজন ইত্যাদি) যা সমস্ত প্রয়োগ করে IUnitOfMeasure। প্রতিটি বিমূর্ত ঘাঁটি শ্রেণি একটি ডিফল্ট ধরণের সংজ্ঞায়িত করে (শ্রেণীর Lengthক্লাসটির একটি ডিফল্ট বাস্তবায়ন ছিল Meter) যা এটি সমস্ত রূপান্তর কাজের জন্য ব্যবহার করবে। অতএব IUnitOfMeasureদুটি পৃথক পদ্ধতি প্রয়োগ করা হয়েছে, ToDefault(decimal)এবং FromDefault(decimal)

আমি যে আসল নম্বরটি মোড়তে চেয়েছিলাম সেটি হ'ল জেনেরিক প্রকারটি IUnitOfMeasureএর জেনেরিক আর্গুমেন্ট হিসাবে গ্রহণ করা। এর মতো কিছু বলা Measurement<Meter>(2.0)আপনাকে স্বয়ংক্রিয় টাইপ সুরক্ষা দেয়। এই ক্লাসগুলিতে যথাযথ অন্তর্নিহিত রূপান্তর এবং গণিত পদ্ধতিগুলি প্রয়োগ করা আপনাকে Measurement<Meter>(2.0) * Measurement<Inch>(12)ডিফল্ট টাইপের ( Meter) ফলাফলের মতো জিনিসগুলি করতে এবং ফলাফল ফেরত দেওয়ার অনুমতি দেয় । আমি কখনই নিউটনের মতো ডাইরেক্ট ইউনিট নিয়ে কাজ করিনি; আমি কেবল এগুলি কিলোগ্রাম * মিটার / দ্বিতীয় / দ্বিতীয় হিসাবে রেখে এসেছি।


জেনেরিক ধরণের ব্যবহারের সাথে আপনি যে পদ্ধতির পরামর্শ দিচ্ছেন তা পছন্দ করি।

1

আমি বিশ্বাস করি উত্তরটি মারিওভিডাব্লু'র স্ট্যাক ওভারফ্লো প্রতিক্রিয়াতে রয়েছে :

ব্যবহারিক উদাহরণ যেখানে Tuple। নেট 4-0 ব্যবহার করা যেতে পারে?

টিউপলসের সাহায্যে আপনি সহজেই দ্বিমাত্রিক অভিধান প্রয়োগ করতে পারেন (বা বিষয়টির জন্য n- মাত্রিক)। উদাহরণস্বরূপ, আপনি মুদ্রা বিনিময় ম্যাপিং কার্যকর করতে এই জাতীয় অভিধান ব্যবহার করতে পারেন:

var forex = new Dictionary<Tuple<string, string>, decimal>();
forex.Add(Tuple.Create("USD", "EUR"), 0.74850m); // 1 USD = 0.74850 EUR
forex.Add(Tuple.Create("USD", "GBP"), 0.64128m);
forex.Add(Tuple.Create("EUR", "USD"), 1.33635m);
forex.Add(Tuple.Create("EUR", "GBP"), 0.85677m);
forex.Add(Tuple.Create("GBP", "USD"), 1.55938m);
forex.Add(Tuple.Create("GBP", "EUR"), 1.16717m);
forex.Add(Tuple.Create("USD", "USD"), 1.00000m);
forex.Add(Tuple.Create("EUR", "EUR"), 1.00000m);
forex.Add(Tuple.Create("GBP", "GBP"), 1.00000m);
decimal result;
result = 35.0m * forex[Tuple.Create("USD", "EUR")]; // USD 35.00 = EUR 26.20
result = 35.0m * forex[Tuple.Create("EUR", "GBP")]; // EUR 35.00 = GBP 29.99
result = 35.0m * forex[Tuple.Create("GBP", "USD")]; // GBP 35.00 = USD 54.58

আমার আবেদনের জন্য আমার একইরকম প্রয়োজন ছিল। Tupleঅপরিবর্তনীয় যা ওজন এবং পরিমাপের মতো বস্তুর ক্ষেত্রেও সত্য ... এই উক্তিটি "চারদিকে বিশ্বব্যাপী এক পিন্ট।"


0

আমার প্রোটোটাইপ কোড: http://ideone.com/x7hz7i

আমার নকশা পয়েন্ট:

  1. সম্পত্তি পেতে / সেট হিসাবে ইউওএম (পরিমাপের একক) পছন্দ
    দৈর্ঘ্য লেন = নতুন দৈর্ঘ্য ();
    len.Meters = 2.0;
    Console.WriteLine (len.Feet);
    
  2. ইউওএম নির্বাচনের জন্য নাম নির্ধারক
    দৈর্ঘ্য লেন = দৈর্ঘ্য.ফর্মমিটার (২.০);
    
  3. ইউওএম-এর জন্য টসস্ট্রিং সমর্থন
    Console.WriteLine (len.ToString ( "ফুট"));
    Console.WriteLine (len.ToString ( "F15"));
    Console.WriteLine (len.ToString ( "ftF15"));
    
  4. রাউন্ডট্রিপ রূপান্তর (দ্বিগুণ নির্ভুলতা দ্বারা স্বল্প রাউন্ডিং ক্ষতির অনুমতি)
    দৈর্ঘ্য লেনআরটিটি = দৈর্ঘ্য.ফর্মমিটার (দৈর্ঘ্য.ফ্রোমফিট (দৈর্ঘ্য.ফ্রোমমিটারস (লেন। মিটার) .ফিট) .মিটার);
    
  5. অপারেটর ওভারলোডিং (তবে মাত্রিক ধরণের চেকের অভাব রয়েছে )
    // বেশ অগোছালো, বগি, অনিরাপদ এবং সম্ভবত এফ # বা সি ++ এমপিএল ব্যবহার করা সম্ভব নয়।
    // এটা বলা যে যায় মাত্রিক বিশ্লেষণ হয় একটি ঐচ্ছিক বৈশিষ্ট্য না UoM জন্য -
    // আপনি এটি সরাসরি ব্যবহার করেন বা না করেন। এটা প্রয়োজন

0

একটি ম্যাগাজিনে নিখরচায় একটি ভাল নিবন্ধ আছে যা এটি জার্মান ভাষায় রয়েছে: http://www.dotnetpro.de/articles/onlinearticle1398.aspx

বেস ধারণাটি বেসম্যাসারমেন্ট সহ দৈর্ঘ্যের মতো ইউনিট শ্রেণি রাখে। শ্রেণিতে রূপান্তর ফ্যাক্টর, অপারেটর ওভারলোডস, টোস্ট্রিং ওভারলোডস, স্ট্রিংগুলির পার্সার এবং একটি সূচক হিসাবে একটি বাস্তবায়ন রয়েছে। এমনকি আমরা এমনকি আর্কিটেকচারাল ভিউ বাস্তবায়ন করেছি কিন্তু এটি একটি লাইব্রেরি হিসাবে প্রকাশ হয় না।

public class Length : MeasurementBase
    {
        protected static double[] LengthFactors = { 1, 100, 1000, 0.001, 100 / 2.54 };
        protected static string[] LengthSymbols = { "m", "cm", "mm", "km", "in" };
...
      public virtual double this[Units unit]
        {
            get { return BaseValue * LengthFactors[(int)unit]; }
            set { BaseValue = value / LengthFactors[(int)unit]; }
        }
...

        public static ForceDividedByLength operator *(Length length, Pressure pressure1)
        {
            return new ForceDividedByLength(pressure1[Pressure.Units.kNm2] * length[Units.m], ForceDividedByLength.Units.kNm);
        }

...

সুতরাং আপনি চাপ অপারেটরের সাথে বা কেবল ব্যবহারটি দেখতে পান:

var l = new Length(5, Length.Units.m)    
Area a = l * new Length("5 m");
a.ToString() // -> 25 m^2
double l2 = l[Length.Units.ft];

তবে আপনি যেমন বলেছিলেন, আমিও ইউনিকর্ন পাইনি :)


-1

এটিই ইউনিক্স কমান্ডের রেইসন ডি'অ্যাট্রেunits , যা সম্পর্কগুলি নির্দিষ্ট করার জন্য এটি সমস্ত ডেটা-ফাইল-চালিত পদ্ধতির ব্যবহার করে।


উল্লেখ করার জন্য আপনাকে ধন্যবাদ units। ইউনিটগুলি আমার বিস্তৃত সমাধানের জন্য কাজ না করার মূল কারণ হ'ল ফর্ম ফর্ম। মঞ্জুর, এটি বিনিময়ে ত্রুটি বার্তাগুলি সরবরাহ করে তবে এই পদ্ধতির বিকাশকারীদের লক্ষ্য করা হচ্ছে যারা আমাদের অ্যাপ্লিকেশনটির সাথে এই কোডটি সংহত করবে। বিনামূল্যে ফর্ম স্ট্রিং ত্রুটির জন্য খুব বেশি সুযোগ উপস্থাপন করে।

1
আপনার unitsডেটা ফাইলটি একবার দেখে নেওয়া উচিত । এটি পরিমাণের মধ্যে সম্পর্ককে যেভাবে সংজ্ঞায়িত করে তা খুব পরিষ্কার এবং আপনার সমস্যার জন্য কার্যকর হতে পারে।
রস প্যাটারসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.