কিভাবে সহজে টিপলস একটি তালিকা আরম্ভ করতে?


286

আমি tuples ভালবাসি । তারা আপনাকে প্রাসঙ্গিক তথ্যগুলির জন্য কোনও কাঠামো বা শ্রেণি না লিখে তাড়াতাড়ি একত্রিত করার অনুমতি দেয় allow খুব স্থানীয় কোড কোড রিফ্যাক্টর করার সময় এটি খুব দরকারী।

তাদের একটি তালিকা আরম্ভ করা যদিও কিছুটা নিরর্থক বলে মনে হয়।

var tupleList = new List<Tuple<int, string>>
{
    Tuple.Create( 1, "cow" ),
    Tuple.Create( 5, "chickens" ),
    Tuple.Create( 1, "airplane" )
};

এর চেয়ে ভাল উপায় আর নেই? ডিকশনারি ইনিশিয়েলাইজারের লাইন ধরে আমি একটি সমাধান পছন্দ করব ।

Dictionary<int, string> students = new Dictionary<int, string>()
{
    { 111, "bleh" },
    { 112, "bloeh" },
    { 113, "blah" }
};

আমরা কি একই ধরণের সিনট্যাক্স ব্যবহার করতে পারি না?


2
এই ক্ষেত্রে আপনি টিপলসের তালিকার পরিবর্তে কোনও অভিধান ব্যবহার করবেন না কেন ?
এড এস

17
@ এড এস: একটি Dictionaryনকল কী অনুমতি দেয় না।
স্টিভেন জিউরিস

2
@ অ্যাডস: প্রতিবার এটি কোনও দ্বি-দ্বিখণ্ডিত নয় যেখানে একটি আইটেমটি ধাবনযোগ্য / প্রচলিত এবং অনন্য।

ভাল কথা, সদৃশ কীটি খেয়াল করেনি।
এড এস

উত্তর:


279

সি # 7.0 আপনাকে এটি করতে দেয়:

  var tupleList = new List<(int, string)>
  {
      (1, "cow"),
      (5, "chickens"),
      (1, "airplane")
  };

আপনার যদি প্রয়োজন হয় না Listতবে কেবল একটি অ্যারে হয় তবে আপনি এটি করতে পারেন:

  var tupleList = new(int, string)[]
  {
      (1, "cow"),
      (5, "chickens"),
      (1, "airplane")
  };

এবং যদি আপনি "আইটেম 1" এবং "আইটেম 2" পছন্দ না করেন তবে আপনি এটি করতে পারেন:

  var tupleList = new List<(int Index, string Name)>
  {
      (1, "cow"),
      (5, "chickens"),
      (1, "airplane")
  };

বা একটি অ্যারের জন্য:

  var tupleList = new (int Index, string Name)[]
  {
      (1, "cow"),
      (5, "chickens"),
      (1, "airplane")
  };

যা আপনাকে করতে দেয়: tupleList[0].IndexএবংtupleList[0].Name

ফ্রেমওয়ার্ক 4.6.2 এবং নীচে

আপনাকে অবশ্যই System.ValueTupleনুগেট প্যাকেজ ম্যানেজার থেকে ইনস্টল করতে হবে ।

ফ্রেমওয়ার্ক 4.7 এবং উপরের

এটি কাঠামোর মধ্যে নির্মিত হয়। ইনস্টল করবেন নাSystem.ValueTuple । আসলে, এটি অপসারণ এবং এটি বিন ডিরেক্টরি থেকে মুছুন।

দ্রষ্টব্য: বাস্তব জীবনে আমি গরু, মুরগি বা বিমানের মধ্যে কোনটি বেছে নিতে পারব না। আমি সত্যিই ছিড়ে যেতে হবে।


2
এটি কি। নেট কোর 2.0 তে ব্যবহার করা যায়?
25 Јевтић

2
@।, System.ValueTupleমূল 2.0 সমর্থন করে। তবে, প্রথমে নুগেট ব্যতীত চেষ্টা করুন, কারণ অপ্রয়োজনীয় প্যাকেজগুলি সমস্যা তৈরি করতে পারে। এক উপায় বা অন্য উপায়, হ্যাঁ। সম্ভব হলে সি # ভি 7 বা তার বেশি ব্যবহার করুন।
টুডমো

1
একেবারে নিখুঁত উত্তর! ধন্যবাদ!
ভিটক্স

224

হ্যাঁ! এটা সম্ভব

{} সংগ্রহ সূচনাকারী কোনো কাজ করে বাক্য গঠন প্রণালী IEnumerable টাইপ যা হয়েছে যোগ আর্গুমেন্ট সঠিক পরিমাণ সঙ্গে পদ্ধতি। কীভাবে এটি কভারগুলির নীচে কাজ করে তা বিরক্ত না করে এর অর্থ আপনি কেবল তালিকা <T> থেকে প্রসারিত করতে পারেন , আপনার টি আরম্ভ করার জন্য একটি কাস্টম অ্যাড পদ্ধতি যুক্ত করতে পারেন এবং আপনার কাজ শেষ হয়েছে!

public class TupleList<T1, T2> : List<Tuple<T1, T2>>
{
    public void Add( T1 item, T2 item2 )
    {
        Add( new Tuple<T1, T2>( item, item2 ) );
    }
}

এটি আপনাকে নিম্নলিখিতগুলি করতে সহায়তা করে:

var groceryList = new TupleList<int, string>
{
    { 1, "kiwi" },
    { 5, "apples" },
    { 3, "potatoes" },
    { 1, "tomato" }
};

39
একটি খারাপ দিক ক্লাস লিখতে হচ্ছে। আপনার মত আমিও টুপলসকে পছন্দ করি কারণ আমাকে ক্লাস বা স্ট্রাক্ট লিখতে হয় না।
গুডেয়ে

2
@ বিলডাব্লু খুব নিশ্চিত নয় এটি সঠিক পোস্ট, ... তবে আমি জানি যে জোন স্কিট এর আগেও এটি লিখেছিল ।
স্টিভেন জিউরিস

1
এই কাজ groceryList[0] == groceryList[1]বা একটি তুলনা বাস্তবায়ন করতে হবে?
বায়ো

এই কোডটি বজায় রাখার সময় অন্যকে বাঁচাতে আমি আইকোলিকেশনটিতে অ্যাড পদ্ধতি যুক্ত একটি নুগেট প্যাকেজ তৈরি করেছি। প্যাকেজের জন্য এখানে দেখুন: nuget.org/packages/Noos.Recines.TupleInitializer কোডের জন্য এখানে দেখুন: github.com/NaosProject/Noos.Recines/blob/master/… এটি "। নাওসের অধীনে আপনার সমাধানে একটি সিএস ফাইল অন্তর্ভুক্ত করবে .আরসিপস "ফোল্ডার, সুতরাং আপনাকে কোনও সমাবেশের নির্ভরতা-টানতে হবে না
SFun28

83

সি # 6 কেবল এটির জন্য একটি নতুন বৈশিষ্ট্য যুক্ত করেছে: এক্সটেনশন যুক্ত পদ্ধতিগুলি। এটি সর্বদা VB.net এর পক্ষে সম্ভব ছিল তবে এটি এখন সি # তে উপলব্ধ।

এখন আপনাকে Add()সরাসরি আপনার ক্লাসে পদ্ধতি যুক্ত করতে হবে না , আপনি এগুলি এক্সটেনশন পদ্ধতি হিসাবে প্রয়োগ করতে পারেন। কোনও Add()পদ্ধতির মাধ্যমে যে কোনও গণ্যমান প্রকার প্রসারিত করার সময়, আপনি এটি সংগ্রহের আরম্ভকারী এক্সপ্রেশনগুলিতে ব্যবহার করতে সক্ষম হবেন। সুতরাং আপনাকে তালিকা থেকে স্পষ্টভাবে আর বের করতে হবে না ( অন্য উত্তরে বর্ণিত হিসাবে ), আপনি কেবল এটি প্রসারিত করতে পারেন।

public static class TupleListExtensions
{
    public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
            T1 item1, T2 item2)
    {
        list.Add(Tuple.Create(item1, item2));
    }

    public static void Add<T1, T2, T3>(this IList<Tuple<T1, T2, T3>> list,
            T1 item1, T2 item2, T3 item3)
    {
        list.Add(Tuple.Create(item1, item2, item3));
    }

    // and so on...
}

এটি আপনাকে প্রয়োগ করে এমন কোনও শ্রেণিতে এটি করার অনুমতি দেবে IList<>:

var numbers = new List<Tuple<int, string>>
{
    { 1, "one" },
    { 2, "two" },
    { 3, "three" },
    { 4, "four" },
    { 5, "five" },
};
var points = new ObservableCollection<Tuple<double, double, double>>
{
    { 0, 0, 0 },
    { 1, 2, 3 },
    { -4, -2, 42 },
};

অবশ্যই আপনি টিউপস সংগ্রহগুলি প্রসারিত করার মধ্যে সীমাবদ্ধ নন, এটি যে নির্দিষ্ট নির্দিষ্ট সংকলনের জন্য আপনি চান সেটি নির্দিষ্ট সংকলনের জন্য হতে পারে।

public static class BigIntegerListExtensions
{
    public static void Add(this IList<BigInteger> list,
        params byte[] value)
    {
        list.Add(new BigInteger(value));
    }

    public static void Add(this IList<BigInteger> list,
        string value)
    {
        list.Add(BigInteger.Parse(value));
    }
}

var bigNumbers = new List<BigInteger>
{
    new BigInteger(1), // constructor BigInteger(int)
    2222222222L,       // implicit operator BigInteger(long)
    3333333333UL,      // implicit operator BigInteger(ulong)
    { 4, 4, 4, 4, 4, 4, 4, 4 },               // extension Add(byte[])
    "55555555555555555555555555555555555555", // extension Add(string)
};

সি # 7 টি ভাষায় নির্মিত টিপলগুলির জন্য সমর্থন যোগ করবে, যদিও সেগুলি ভিন্ন ধরণের ( System.ValueTupleপরিবর্তে) হবে। সুতরাং মান টিউপসগুলির জন্য ওভারলোডগুলি যুক্ত করা ভাল হবে যাতে আপনার সেগুলিও ব্যবহার করার বিকল্প রয়েছে। দুর্ভাগ্যক্রমে, দুজনের মধ্যে কোনও অন্তর্ভুক্ত রূপান্তর নেই are

public static class ValueTupleListExtensions
{
    public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
        ValueTuple<T1, T2> item) => list.Add(item.ToTuple());
}

এই ভাবে তালিকার সূচনাটি আরও সুন্দর দেখাবে।

var points = new List<Tuple<int, int, int>>
{
    (0, 0, 0),
    (1, 2, 3),
    (-1, 12, -73),
};

তবে এই সমস্ত সমস্যার মধ্য দিয়ে যাওয়ার পরিবর্তে ValueTupleএকচেটিয়াভাবে ব্যবহার করা আরও ভাল ।

var points = new List<(int, int, int)>
{
    (0, 0, 0),
    (1, 2, 3),
    (-1, 12, -73),
};

আমার লাইব্রেরিটি সি # 6.0 এ আপডেট করার সময় আমি অবশেষে এটিকে একটি শালীন দৃষ্টিতে দেখেছি। যদিও এটি এক নজরে ভাল দেখায়, আমি এর চেয়ে আমার আগের পোস্ট সমাধানটি পছন্দ করি কারণ আমি TupleList<int, string>.তার চেয়ে বেশি পঠনযোগ্য বলে মনে করি List<Tuple<int, string>>
স্টিভেন জিউরিস

1
এটি এমন একটি বিষয় যা কোনও টাইপ ওরফে ঠিক করতে পারে। মঞ্জুর করা হয়েছে যে নিজের নামটি নিজেই জেনেরিক হতে পারে যা পছন্দনীয়। using TupleList = System.Collections.Generic.List<System.Tuple<int, string>>;
জেফ মার্কাডো

এই কোডটি বজায় রাখার সময় অন্যকে বাঁচাতে আমি আইকোলিকেশনটিতে অ্যাড পদ্ধতি যুক্ত একটি নুগেট প্যাকেজ তৈরি করেছি। প্যাকেজের জন্য এখানে দেখুন: nuget.org/packages/Noos.Recines.TupleInitializer কোডের জন্য এখানে দেখুন: github.com/NaosProject/Noos.Recines/blob/master/… এটি "। নাওসের অধীনে আপনার সমাধানে একটি সিএস ফাইল অন্তর্ভুক্ত করবে .আরসিপস "ফোল্ডার, সুতরাং আপনাকে কোনও সমাবেশের নির্ভরতা-টানতে হবে না
SFun28

42

আপনি প্রতিবার কনস্ট্রাক্টরকে কল করে এটি করতে পারেন কিছুটা ভাল

var tupleList = new List<Tuple<int, string>>
{
    new Tuple<int, string>(1, "cow" ),
    new Tuple<int, string>( 5, "chickens" ),
    new Tuple<int, string>( 1, "airplane" )
};

6
আমি আসল কোডটি কাজ করতে পারি না, সুতরাং এটির যা আমি মনে করি তার সাথে আমি এটি সংশোধন করেছি ... যা সিনট্যাক্স "সর্বোপরি ভাল" কিনা এই বিষয়ে আপনার মতামতের বিপরীত হতে পারে :)
ওনেদায়ে

5
কমপক্ষে Tuple.Createপরিবর্তে ব্যবহার করুন এবং আপনি প্রকার আর্গুমেন্টগুলি অনুমান করতে পারেন
ডেভ কাজিনো

28

পুরানো প্রশ্ন, তবে জিনিসগুলিকে কিছুটা বেশি পাঠযোগ্য করে তোলার জন্য আমি সাধারণত এটি করি:

Func<int, string, Tuple<int, string>> tc = Tuple.Create;

var tupleList = new List<Tuple<int, string>>
{
    tc( 1, "cow" ),
    tc( 5, "chickens" ),
    tc( 1, "airplane" )
};

.NET এর পুরানো সংস্করণগুলিতেও কাজ করে!
এড বায়িয়েটস

1

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

  1. সরাসরি ইনস্ট্যান্টেশন
var items = new List<(int Id, string Name)> { (1, "Me"), (2, "You")};
  1. বিদ্যমান সংগ্রহের অফ, এবং এখন আপনি কীভাবে বেনামে প্রজেকশন করতেন তার অনুরূপ ভাল টাইপ করা টিপলগুলি ফিরে আসতে পারেন।
public class Hold
{
    public int Id { get; set; }
    public string Name { get; set; }
}

//In some method or main console app:
var holds = new List<Hold> { new Hold { Id = 1, Name = "Me" }, new Hold { Id = 2, Name = "You" } };
var anonymousProjections = holds.Select(x => new { SomeNewId = x.Id, SomeNewName = x.Name });
var namedTuples = holds.Select(x => (TupleId: x.Id, TupleName: x.Name));
  1. টিপলগুলি পরে গ্রুপিং পদ্ধতিগুলির সাথে পুনরায় ব্যবহার করুন বা অন্য যুক্তিতে তাদের ইনলাইন তৈরি করতে একটি পদ্ধতি ব্যবহার করুন:
//Assuming holder class above making 'holds' object
public (int Id, string Name) ReturnNamedTuple(int id, string name) => (id, name);
public static List<(int Id, string Name)> ReturnNamedTuplesFromHolder(List<Hold> holds) => holds.Select(x => (x.Id, x.Name)).ToList();
public static void DoSomethingWithNamedTuplesInput(List<(int id, string name)> inputs) => inputs.ForEach(x => Console.WriteLine($"Doing work with {x.id} for {x.name}"));

var namedTuples2 = holds.Select(x => ReturnNamedTuple(x.Id, x.Name));
var namedTuples3 = ReturnNamedTuplesFromHolder(holds);
DoSomethingWithNamedTuplesInput(namedTuples.ToList());

তুমি আমাকে বুড়ো বানাবে। :) আমি এখানে কিছু অনুভব করতে পারি, তবে 'হোল্ডস' শুরু করা মোটেই সংক্ষিপ্ত নয়। এই প্রশ্নের সঠিক পয়েন্ট ছিল।
স্টিভেন জিউরিস

@ স্টিভেন জিউরিস না, আপনি ঠিক বলেছেন আমি পয়েন্ট ১ এর জন্য ভুল কোডটি অনুলিপি করে আটকালাম আমি 'সাবমিট' চাপার আগে কিছুটা ধীর হওয়া দরকার।
djangojazz

0

টিপলস পছন্দ করেন কেন? এটি নামবিহীন প্রকারের মতো: কোনও নাম নেই। তথ্য কাঠামো বুঝতে পারি না।

আমি ক্লাসিক ক্লাস পছন্দ করি

class FoodItem
{
     public int Position { get; set; }
     public string Name { get; set; }
}

List<FoodItem> list = new List<FoodItem>
{
     new FoodItem { Position = 1, Name = "apple" },
     new FoodItem { Position = 2, Name = "kiwi" }
};

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

1
আপনি পুরানো টিপল ক্লাসের কথা ভাবছেন (স্ট্রাক্ট নয়)। সি # 7 স্ট্রাক্ট-ভিত্তিক টিউপস যুক্ত করেছে (নতুন ভ্যালুটুপল প্রকারের সাহায্যে) এর নাম থাকতে পারে, যাতে আপনি ডেটা কাঠামো বুঝতে পারবেন
স্টিভ নাইলস

0

আমার মনে হয় একটি কৌশলটি কিছুটা সহজ এবং এটি এখানে আগে উল্লেখ করা হয়নি:

var asdf = new [] { 
    (Age: 1, Name: "cow"), 
    (Age: 2, Name: "bird")
}.ToList();

আমি মনে করি এটি এর চেয়ে একটু পরিষ্কার er

var asdf = new List<Tuple<int, string>> { 
    (Age: 1, Name: "cow"), 
    (Age: 2, Name: "bird")
};

আপনি স্বতন্ত্রভাবে প্রকারগুলি উল্লেখ করতে পছন্দ করেন বা না চান, একইভাবে নিরর্থকভাবে ব্যবহার করা varবা না করা উচিত তা স্বাদে আরও আসে । আমি ব্যক্তিগতভাবে স্পষ্ট টাইপিং পছন্দ করি (যখন এটি নির্মাণকারীর সদৃশ হয় না))
স্টিভেন জিউরিস 12 '20

-4
    var colors = new[]
    {
        new { value = Color.White, name = "White" },
        new { value = Color.Silver, name = "Silver" },
        new { value = Color.Gray, name = "Gray" },
        new { value = Color.Black, name = "Black" },
        new { value = Color.Red, name = "Red" },
        new { value = Color.Maroon, name = "Maroon" },
        new { value = Color.Yellow, name = "Yellow" },
        new { value = Color.Olive, name = "Olive" },
        new { value = Color.Lime, name = "Lime" },
        new { value = Color.Green, name = "Green" },
        new { value = Color.Aqua, name = "Aqua" },
        new { value = Color.Teal, name = "Teal" },
        new { value = Color.Blue, name = "Blue" },
        new { value = Color.Navy, name = "Navy" },
        new { value = Color.Pink, name = "Pink" },
        new { value = Color.Fuchsia, name = "Fuchsia" },
        new { value = Color.Purple, name = "Purple" }
    };
    foreach (var color in colors)
    {
        stackLayout.Children.Add(
            new Label
            {
                Text = color.name,
                TextColor = color.value,
            });
        FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label))
    }

this is a Tuple<Color, string>

আপনি কীভাবে একটি টিপল সহ মান / নাম সিনট্যাক্স পাবেন?
আন্দ্রেয়াস রিফ 9

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