Đặt tên tốt hơn trong các lớp Tuple hơn là Item Item1,, Item Item2


204

Có cách nào để sử dụng lớp Tuple, nhưng cung cấp tên của các mục trong đó không?

Ví dụ:

public Tuple<int, int, int int> GetOrderRelatedIds()

Điều đó trả về các id cho OrdergroupId, OrderTypeId, OrderSubTypeId và OrderRequonthId.

Nó sẽ là tốt đẹp để cho người dùng phương pháp của tôi biết đó là cái nào. (Khi bạn gọi phương thức, kết quả là result.Item1, result.Item2, result.Item3, result.Item4. Không rõ cái nào là cái nào.)

(Tôi biết rằng tôi chỉ có thể tạo một lớp để chứa tất cả các Id này, nhưng các Id này đã có các lớp riêng mà chúng sống và tạo một lớp cho giá trị trả về của một phương thức này có vẻ ngớ ngẩn.)


1
Bạn sẽ phải tự lăn lộn - Tuplerất chung chung, vì vậy đó là tất cả những gì bạn nhận được
BrokenGlass

KHÔNG bạn không thể làm như vậy, hãy xem liên kết này để biết thêm thông tin msdn.microsoft.com/en-us/vcsharp/ee957397
Enigma State

1
Tôi muốn mạo hiểm nói rằng sử dụng Tuple làm kiểu dữ liệu công khai cho api của bạn có thể không được khuyến nghị. Tôi thường sử dụng Tuple cho những thứ nội bộ tồn tại trong thời gian ngắn không phải là giá trị trả về của API.
Mike Burdick

1
Bình chọn cho tính năng này tại đó: visualstudio.uservoice.com/forums/121579-visual-studio-2015/iêu
John

4
Nó nằm trong danh sách làm việc của C # 7 Xem github.com/dotnet/roslyn/issues/347
Philip Đinh

Câu trả lời:


277

Trong C # 7.0 (Visual Studio 2017) có một cấu trúc mới để làm điều đó:

(string first, string middle, string last) LookupName(long id)

68
Cú pháp là List<(int first, int second)>. Tôi đã phải tải xuống gói System.ValueTuple từ NuGet để nó hoạt động trong Visual Studio 2017.
Matt Davis

14
Để tạo giá trịreturn (first: first, middle: middle, last: last);
fiat

4
hoặc chỉ: return (first, middle, last);trong .NET 4.7.1 (không chắc chắn cho 4.7.0)
watbywbarif

1
để sử dụng nó, bạn sẽ cần thêm gói nuget System.ValueTuple
Alex G

11
Cần lưu ý rằng C # 7 ValueTuple, trong khi thường là tuyệt vời, là loại giá trị có thể thay đổi (struct), trong khi Tuplelà loại tham chiếu (lớp) không thay đổi. Theo tôi biết, không có cách nào để có được một loại tham chiếu Tuplevới tên vật phẩm thân thiện.
dx_over_dt

51

Lên đến C # 7.0, không có cách nào để thực hiện việc này trong việc xác định loại của riêng bạn.


13
Tôi không thể tin rằng câu trả lời này được chấp nhận với số điểm 40. Ít nhất bạn có thể chỉ ra cách một lớp với một nhà xây dựng phù hợp có thể thay thế điều này.
bytecode77

1
@ bytecode77 Chà, chẳng mấy chốc câu trả lời này sẽ bị sai ngay: github.com/dotnet/roslyn/issues/347
MarkPflug 19/8/2016

Tôi đã thấy những đề xuất lễ hội ngôn ngữ. Nhưng cho đến nay, một lớp là giải pháp thích hợp duy nhất cho các kiểu dữ liệu phức tạp hơn. Tại sao bạn muốn sử dụng Tuples một cách ép buộc bất kể điều gì (xem các câu trả lời khác)
bytecode77

3
Sau khi C # 7 được phát hành, bạn có thể thực hiện việc này: msdn.microsoft.com/en-us/magazine/mt595758.aspx
Burak Karakuş

11
Q 'có c # 4 làm thẻ, vì vậy mặc dù câu trả lời này ngắn nhưng vẫn đúng.
Steve Drake

33

Đây là một phiên bản quá phức tạp của những gì bạn đang hỏi:

class MyTuple : Tuple<int, int>
{
    public MyTuple(int one, int two)
        :base(one, two)
    {

    }

    public int OrderGroupId { get{ return this.Item1; } }
    public int OrderTypeId { get{ return this.Item2; } }

}

Tại sao không chỉ làm một lớp học?


2
cấu trúc sẽ tốt hơn trong trường hợp này thay vì Class?
cái chết

5
Ưu điểm nhỏ mà tôi thấy ở đây là nó tự động thực hiện toán tử bằng, kiểm tra xem 2 trường hợp có bằng nhau không nếu các mục đều bằng nhau.
JSoet

8
Một nhược điểm khác của phương pháp này là Item1 và Item2 vẫn là các thuộc tính công khai trên MyTuple
RJFalconer

3
@deathrace Bản thân Tuple là các lớp, vì vậy nếu bạn muốn trực tiếp kế thừa từ Tuple<T, T2>bạn thì không thể là một cấu trúc.
Chakrava

3
Tôi có thể sai nhưng tôi chủ yếu sử dụng tuple bất cứ nơi nào tôi muốn trả lại một đối tượng nhưng không muốn xác định một lớp cụ thể ..
Jay

12

ExpandoObjectTuy nhiên, với .net 4, bạn có thể xem xét , tuy nhiên, không sử dụng nó cho trường hợp đơn giản này vì những gì đã được biên dịch - lỗi thời gian trở thành lỗi thời gian chạy.

class Program
{
    static void Main(string[] args)
    {
        dynamic employee, manager;

        employee = new ExpandoObject();
        employee.Name = "John Smith";
        employee.Age = 33;

        manager = new ExpandoObject();
        manager.Name = "Allison Brown";
        manager.Age = 42;
        manager.TeamSize = 10;

        WritePerson(manager);
        WritePerson(employee);
    }
    private static void WritePerson(dynamic person)
    {
        Console.WriteLine("{0} is {1} years old.",
                          person.Name, person.Age);
        // The following statement causes an exception
        // if you pass the employee object.
        // Console.WriteLine("Manages {0} people", person.TeamSize);
    }
}
// This code example produces the following output:
// John Smith is 33 years old.
// Allison Brown is 42 years old.

Một cái gì đó khác đáng nói là một loại ẩn danh cho trong một phương thức , nhưng bạn cần tạo một lớp nếu bạn muốn trả về nó.

var MyStuff = new
    {
        PropertyName1 = 10,
        PropertyName2 = "string data",
        PropertyName3 = new ComplexType()
    };

10

Tái tạo câu trả lời của tôi từ đây bài đăng vì nó phù hợp hơn ở đây.

Bắt đầu từ C # v7.0, bây giờ có thể đặt tên cho các thuộc tính tuple mà trước đây được sử dụng để mặc định cho các tên được xác định trước như Item1, Item2v.v.

Đặt tên các thuộc tính của Tuple Literals :

var myDetails = (MyName: "RBT_Yoga", MyAge: 22, MyFavoriteFood: "Dosa");
Console.WriteLine($"Name - {myDetails.MyName}, Age - {myDetails.MyAge}, Passion - {myDetails.MyFavoriteFood}");

Đầu ra trên bàn điều khiển:

Tên - RBT_Yoga, Tuổi - 22, Đam mê - Dosa

Trả về Tuple (có các thuộc tính được đặt tên) từ một phương thức :

static void Main(string[] args)
{
    var empInfo = GetEmpInfo();
    Console.WriteLine($"Employee Details: {empInfo.firstName}, {empInfo.lastName}, {empInfo.computerName}, {empInfo.Salary}");
}

static (string firstName, string lastName, string computerName, int Salary) GetEmpInfo()
{
    //This is hardcoded just for the demonstration. Ideally this data might be coming from some DB or web service call
    return ("Rasik", "Bihari", "Rasik-PC", 1000);
}

Đầu ra trên bàn điều khiển:

Chi tiết nhân viên: Rasik, Bihari, Rasik-PC, 1000

Tạo một danh sách các Tuples có thuộc tính được đặt tên

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

foreach (var tuple in tupleList)
    Console.WriteLine($"{tuple.Index} - {tuple.Name}");

Đầu ra trên bàn điều khiển:

1 - bò 5 - gà 1 - máy bay

Tôi hy vọng tôi đã bao gồm tất cả mọi thứ. Trong trường hợp, có bất cứ điều gì tôi đã bỏ lỡ sau đó xin vui lòng cho tôi một phản hồi trong các ý kiến.

Lưu ý : Đoạn mã của tôi đang sử dụng tính năng nội suy chuỗi của C # v7 như chi tiết ở đây .


3

MichaelMocko đã trả lời là tuyệt vời,

nhưng tôi muốn thêm một vài điều mà tôi phải tìm ra

(string first, string middle, string last) LookupName(long id)

ở trên Line sẽ cung cấp cho bạn lỗi thời gian biên dịch nếu bạn đang sử dụng .net framework <4.7

Vì vậy, nếu bạn có một dự án đang sử dụng .net framework <4.7 và bạn vẫn muốn sử dụng ValueTuple hơn workAround sẽ cài đặt gói nuget này



2

Nếu các loại mặt hàng của bạn đều khác nhau, thì đây là một lớp tôi đã thực hiện để có được chúng bằng trực giác hơn.

Việc sử dụng lớp này:

var t = TypedTuple.Create("hello", 1, new MyClass());
var s = t.Get<string>();
var i = t.Get<int>();
var c = t.Get<MyClass>();

Mã nguồn:

public static class TypedTuple
{
    public static TypedTuple<T1> Create<T1>(T1 t1)
    {
        return new TypedTuple<T1>(t1);
    }

    public static TypedTuple<T1, T2> Create<T1, T2>(T1 t1, T2 t2)
    {
        return new TypedTuple<T1, T2>(t1, t2);
    }

    public static TypedTuple<T1, T2, T3> Create<T1, T2, T3>(T1 t1, T2 t2, T3 t3)
    {
        return new TypedTuple<T1, T2, T3>(t1, t2, t3);
    }

    public static TypedTuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 t1, T2 t2, T3 t3, T4 t4)
    {
        return new TypedTuple<T1, T2, T3, T4>(t1, t2, t3, t4);
    }

    public static TypedTuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5)
    {
        return new TypedTuple<T1, T2, T3, T4, T5>(t1, t2, t3, t4, t5);
    }

    public static TypedTuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6)
    {
        return new TypedTuple<T1, T2, T3, T4, T5, T6>(t1, t2, t3, t4, t5, t6);
    }

    public static TypedTuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7)
    {
        return new TypedTuple<T1, T2, T3, T4, T5, T6, T7>(t1, t2, t3, t4, t5, t6, t7);
    }

    public static TypedTuple<T1, T2, T3, T4, T5, T6, T7, T8> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8)
    {
        return new TypedTuple<T1, T2, T3, T4, T5, T6, T7, T8>(t1, t2, t3, t4, t5, t6, t7, t8);
    }

}

public class TypedTuple<T>
{
    protected Dictionary<Type, object> items = new Dictionary<Type, object>();

    public TypedTuple(T item1)
    {
        Item1 = item1;
    }

    public TSource Get<TSource>()
    {
        object value;
        if (this.items.TryGetValue(typeof(TSource), out value))
        {
            return (TSource)value;
        }
        else
            return default(TSource);
    }

    private T item1;
    public T Item1 { get { return this.item1; } set { this.item1 = value; this.items[typeof(T)] = value; } }
}

public class TypedTuple<T1, T2> : TypedTuple<T1>
{
    public TypedTuple(T1 item1, T2 item2)
        : base(item1)
    {
        Item2 = item2;
    }

    private T2 item2;
    public T2 Item2 { get { return this.item2; } set { this.item2 = value; this.items[typeof(T2)] = value; } }
}

public class TypedTuple<T1, T2, T3> : TypedTuple<T1, T2>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3)
        : base(item1, item2)
    {
        Item3 = item3;
    }

    private T3 item3;
    public T3 Item3 { get { return this.item3; } set { this.item3 = value; this.items[typeof(T3)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4> : TypedTuple<T1, T2, T3>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4)
        : base(item1, item2, item3)
    {
        Item4 = item4;
    }

    private T4 item4;
    public T4 Item4 { get { return this.item4; } set { this.item4 = value; this.items[typeof(T4)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4, T5> : TypedTuple<T1, T2, T3, T4>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
        : base(item1, item2, item3, item4)
    {
        Item5 = item5;
    }

    private T5 item5;
    public T5 Item5 { get { return this.item5; } set { this.item5 = value; this.items[typeof(T5)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4, T5, T6> : TypedTuple<T1, T2, T3, T4, T5>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
        : base(item1, item2, item3, item4, item5)
    {
        Item6 = item6;
    }

    private T6 item6;
    public T6 Item6 { get { return this.item6; } set { this.item6 = value; this.items[typeof(T6)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4, T5, T6, T7> : TypedTuple<T1, T2, T3, T4, T5, T6>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
        : base(item1, item2, item3, item4, item5, item6)
    {
        Item7 = item7;
    }

    private T7 item7;
    public T7 Item7 { get { return this.item7; } set { this.item7 = value; this.items[typeof(T7)] = value; } }
}

public class TypedTuple<T1, T2, T3, T4, T5, T6, T7, T8> : TypedTuple<T1, T2, T3, T4, T5, T6, T7>
{
    public TypedTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
        : base(item1, item2, item3, item4, item5, item6, item7)
    {
        Item8 = item8;
    }

    private T8 item8;
    public T8 Item8 { get { return this.item8; } set { this.item8 = value; this.items[typeof(T8)] = value; } }
}

4
Điều này có vẻ như rất nhiều công việc cho ít hoặc không có kết quả. Nó có một giới hạn không trực quan (không có loại trùng lặp) và tôi thấy ý tưởng lấy một giá trị chỉ bằng loại của nó một cách cực kỳ không trực quan và không thể nghĩ ra trường hợp sử dụng thực tế cho nó. Điều này tương đương với việc tạo một bảng dữ liệu cho nhân viên, sau đó quyết định lấy nhân viên bằng tên của họ (trái ngược với khóa duy nhất) và sau đó yêu cầu tất cả nhân viên phải có tên khác nhau. Đây không phải là giải pháp cho một vấn đề, nó sử dụng một giải pháp với chi phí tạo ra một vấn đề khác.
Flater

Và xin Chúa thương xót tâm hồn bạn.
Jamie M.

1

Điều này rất khó chịu và tôi hy vọng các phiên bản tương lai của C # sẽ giải quyết nhu cầu này. Tôi thấy công việc đơn giản nhất là sử dụng một loại cấu trúc dữ liệu khác hoặc đổi tên "mục" cho sự tỉnh táo của bạn và cho sự tỉnh táo của người khác khi đọc mã của bạn.

Tuple<ApiResource, JSendResponseStatus> result = await SendApiRequest();
ApiResource apiResource = result.Item1;
JSendResponseStatus jSendStatus = result.Item2;

0

Tôi nghĩ rằng tôi sẽ tạo một lớp nhưng một lựa chọn khác là các tham số đầu ra.

public void GetOrderRelatedIds(out int OrderGroupId, out int OrderTypeId, out int OrderSubTypeId, out int OrderRequirementId)

Vì Tuple của bạn chỉ chứa các số nguyên, bạn có thể biểu thị nó bằng một Dictionary<string,int>

var orderIds = new Dictionary<string, int> {
    {"OrderGroupId", 1},
    {"OrderTypeId", 2},
    {"OrderSubTypeId", 3},
    {"OrderRequirementId", 4}.
};

nhưng tôi cũng không khuyên bạn như vậy.


0

Tại sao mọi người làm cho cuộc sống rất khó khăn. Tuples là để xử lý dữ liệu khá tạm thời . Làm việc với Tuples mọi lúc sẽ khiến mã rất khó hiểu vào một lúc nào đó. Tạo lớp cho mọi thứ cuối cùng có thể làm nở dự án của bạn.

Đó là về sự cân bằng, tuy nhiên ...

Vấn đề của bạn dường như là một cái gì đó bạn sẽ muốn một lớp học. Và chỉ để hoàn thiện, lớp này bên dưới cũng chứa các hàm tạo.


Đây là mô hình thích hợp cho

  • Một kiểu dữ liệu tùy chỉnh
    • không có thêm chức năng. Getters và setters cũng có thể được mở rộng bằng mã, nhận / thiết lập các thành viên riêng với mẫu tên "_ordergroupId", đồng thời thực thi mã chức năng.
  • Bao gồm các nhà xây dựng. Bạn cũng có thể chọn chỉ bao gồm một hàm tạo nếu tất cả thuộc tính là bắt buộc.
  • Nếu bạn muốn sử dụng tất cả các hàm tạo, bong bóng như thế này là mẫu thích hợp để tránh mã trùng lặp.

public class OrderRelatedIds
{
    public int OrderGroupId { get; set; }
    public int OrderTypeId { get; set; }
    public int OrderSubTypeId { get; set; }
    public int OrderRequirementId { get; set; }

    public OrderRelatedIds()
    {
    }
    public OrderRelatedIds(int orderGroupId)
        : this()
    {
        OrderGroupId = orderGroupId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId)
        : this(orderGroupId)
    {
        OrderTypeId = orderTypeId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId)
        : this(orderGroupId, orderTypeId)
    {
        OrderSubTypeId = orderSubTypeId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId, int orderRequirementId)
        : this(orderGroupId, orderTypeId, orderSubTypeId)
    {
        OrderRequirementId = orderRequirementId;
    }
}

Hoặc, nếu bạn muốn nó thực sự đơn giản: Bạn cũng có thể sử dụng kiểu khởi tạo:

OrderRelatedIds orders = new OrderRelatedIds
{
    OrderGroupId = 1,
    OrderTypeId = 2,
    OrderSubTypeId = 3,
    OrderRequirementId = 4
};

public class OrderRelatedIds
{
    public int OrderGroupId;
    public int OrderTypeId;
    public int OrderSubTypeId;
    public int OrderRequirementId;
}

0

Tôi sẽ viết tên Item vào mùa hè .. vì vậy bằng cách di chuột qua hàm hellowworld () văn bản sẽ nói hello = Item1 và world = Item2

 helloworld("Hi1,Hi2");

/// <summary>
/// Return hello = Item1 and world Item2
/// </summary>
/// <param name="input">string to split</param>
/// <returns></returns>
private static Tuple<bool, bool> helloworld(string input)
{
    bool hello = false;
    bool world = false;
    foreach (var hw in input.Split(','))
    {
        switch (hw)
        {
            case "Hi1":
                hello= true;
                break;
            case "Hi2":
                world= true;
                break;
        }

    }
    return new Tuple<bool, bool>(hello, world);
}

0

Chỉ cần thêm vào câu trả lời @MichaelMocko. Tuples có vài gotchas tại thời điểm này:

Bạn không thể sử dụng chúng trong các cây biểu hiện EF

Thí dụ:

public static (string name, string surname) GetPersonName(this PersonContext ctx, int id)
{
    return ctx.Persons
        .Where(person => person.Id == id)
        // Selecting as Tuple
        .Select(person => (person.Name, person.Surname))
        .First();
}

Điều này sẽ không được biên dịch với lỗi "Cây biểu thức có thể không chứa lỗi tuple". Thật không may, API cây biểu thức không được mở rộng với sự hỗ trợ cho các bộ dữ liệu khi chúng được thêm vào ngôn ngữ.

Theo dõi (và upvote) vấn đề này cho các bản cập nhật: https://github.com/dotnet/roslyn/issues/12897

Để giải quyết vấn đề, trước tiên bạn có thể chuyển nó sang loại ẩn danh và sau đó chuyển đổi giá trị thành tuple:

// Will work
public static (string name, string surname) GetPersonName(this PersonContext ctx, int id)
{
    return ctx.Persons
        .Where(person => person.Id == id)
        .Select(person => new { person.Name, person.Surname })
        .ToList()
        .Select(person => (person.Name, person.Surname))
        .First();
}

Một tùy chọn khác là sử dụng ValueTuple.Create:

// Will work
public static (string name, string surname) GetPersonName(this PersonContext ctx, int id)
{
    return ctx.Persons
        .Where(person => person.Id == id)
        .Select(person => ValueTuple.Create(person.Name, person.Surname))
        .First();
}

Người giới thiệu:

Bạn không thể giải cấu trúc chúng trong lambdas

Có một đề xuất để thêm hỗ trợ: https://github.com/dotnet/csharplang/issues/258

Thí dụ:

public static IQueryable<(string name, string surname)> GetPersonName(this PersonContext ctx, int id)
{
    return ctx.Persons
        .Where(person => person.Id == id)
        .Select(person => ValueTuple.Create(person.Name, person.Surname));
}

// This won't work
ctx.GetPersonName(id).Select((name, surname) => { return name + surname; })

// But this will
ctx.GetPersonName(id).Select(t => { return t.name + t.surname; })

Người giới thiệu:

Họ sẽ không tuần tự độc đáo

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main() {
        var me = (age: 21, favoriteFood: "Custard");
        string json = JsonConvert.SerializeObject(me);

        // Will output {"Item1":21,"Item2":"Custard"}
        Console.WriteLine(json); 
    }
}

Tên trường tuple chỉ khả dụng tại thời gian biên dịch và bị xóa hoàn toàn khi chạy.

Người giới thiệu:


-1

Bạn có thể viết một lớp có chứa Tuple.

Bạn cần ghi đè các hàm Equals và GetHashCode

và các toán tử == và! =.

class Program
{
    public class MyTuple
    {
        private Tuple<int, int> t;

        public MyTuple(int a, int b)
        {
            t = new Tuple<int, int>(a, b);
        }

        public int A
        {
            get
            {
                return t.Item1;
            }
        }

        public int B
        {
            get
            {
                return t.Item2;
            }
        }

        public override bool Equals(object obj)
        {
            return t.Equals(((MyTuple)obj).t);
        }

        public override int GetHashCode()
        {
            return t.GetHashCode();
        }

        public static bool operator ==(MyTuple m1, MyTuple m2)
        {
            return m1.Equals(m2);
        }

        public static bool operator !=(MyTuple m1, MyTuple m2)
        {
            return !m1.Equals(m2);
        }
    }

    static void Main(string[] args)
    {
        var v1 = new MyTuple(1, 2);
        var v2 = new MyTuple(1, 2);

        Console.WriteLine(v1 == v2);

        Dictionary<MyTuple, int> d = new Dictionary<MyTuple, int>();
        d.Add(v1, 1);

        Console.WriteLine(d.ContainsKey(v2));
    }
}

sẽ trở lại:

Thật

Thật


2
Nếu bạn đã triển khai một lớp cho loại dữ liệu này, tại sao bạn lại khai báo một Tuple cho dữ liệu cơ bản thay vì chỉ các thuộc tính?
bytecode77

Tôi muốn sử dụng thuộc tính tuple mà nó biên dịch theo giá trị trong hàm Equals
ss

Đó có thể là một phần thưởng. Nhưng mặt khác, về cơ bản bạn đã tạo ra một lớp với các thuộc tính nằm trong khoảng từ Item1 đến ItemX. Tôi sẽ chọn cách đặt tên thích hợp và nhiều mã hơn trong Equals () bằng cách sử dụng bộ dữ liệu.
bytecode77

-1

Ví dụ tuple C # 7

var tuple = TupleExample(key, value);

     private (string key1, long value1) ValidateAPIKeyOwnerId(string key, string value)
            {
                return (key, value);
            }
      if (!string.IsNullOrEmpty(tuple.key1) && tuple.value1 > 0)
          {
                    //your code

                }     
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.