2 Câu hỏi: Cách xác định giá trị cao nhất trong danh sách các thuộc tính

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi có một lớp như thế này:

class MyClass
{
    public int Value1 {get; set;}
    public int Value2 {get; set;}
    public int Value3 {get; set;}
    public int Value4 {get; set;}
    ...

    public string AnotherValue {get; set;}
}

Trong thực tế có khoảng 10 thuộc tính, tất cả các giá trị giữ. Những gì tôi đang cố gắng làm là xác định tài sản có giá trị cao nhất. Ban đầu tôi nghĩ đây sẽ là một nhiệm vụ tầm thường, nhưng cho đến nay, tôi chỉ tìm ra hai cách để đạt được nó và không ai trong số họ cảm thấy rất thanh lịch.

Cách đầu tiên của tôi là chỉ cần kiểm tra từng giá trị:

int runningValue = myClass.Value1;
if (myClass.Value2 > runningValue)
    runningValue = myClass.Value2;
// etc...

Cách thứ hai là sử dụng sự phản chiếu để làm điều tương tự, nhưng trong một vòng lặp của tất cả các thuộc tính - mặc dù điều này không lý tưởng vì có các thuộc tính như AnotherValue mà tôi sẽ cần loại trừ.

Câu hỏi của tôi là: có cách nào khác để đạt được điều này không?

    
0
  1. Bạn nên sử dụng một số loại bộ sưu tập trong trường hợp này
    2019-05-08 15: 47: 29Z
  2. Có mẫu nào cho tên của các thuộc tính mà bạn cần so sánh không? Cách tiếp cận thứ 2 của bạn là cách tốt nhất để tiếp tục, có thể tạo một danh sách meta các tên thuộc tính mà bạn sẽ cần so sánh và sử dụng danh sách đó để lọc các thuộc tính
    2019-05-08 15: 51: 42Z
  3. @ OldProgrammer Tôi e rằng tôi không có bất kỳ quyền kiểm soát nào đối với cấu trúc của lớp.
    2019-05-08 15: 56: 49Z
2 Câu trả lời                              2                         

Tôi sẽ đề nghị bạn sử dụng bộ sưu tập hoặc danh sách thay vì một đối tượng để mang cùng loại dữ liệu.

Nhưng đối với câu hỏi của bạn, bạn có thể thử sử dụng phản chiếu GetProperties để lấy tất cả những gì bạn muốn so sánh dữ liệu từ đối tượng của mình.

x.PropertyType == typeof(int) có thể đảm bảo loại bạn muốn nhận được cho câu hỏi của bạn mà bạn có thể muốn so sánh với int.

MyClass a = new MyClass()
{
    Value1 =  10,
    Value2 = 11,
    Value3 = 12,
    Value4 = 14
};

a.GetType()
    .GetProperties()
    .Where(x => x.PropertyType == typeof(int) )
    .Select(x => Convert.ToInt32(x.GetValue(a)))
    .Max(x=>x);

c # trực tuyến

    
3
2019-05-08 15: 54: 48Z
  1. Tôi không có quyền kiểm soát cấu trúc của lớp. Cám ơn vì cái này; tuy nhiên, đây là sử dụng sự phản chiếu.
    2019-05-08 16: 00: 15Z

Một bộ sưu tập chắc chắn sẽ làm cho nhiệm vụ này dễ dàng hơn nhiều. Nếu bạn quyết định đi theo tuyến đường đó, bạn vẫn có thể có các thuộc tính cho Value1 /Value2 /etc .., tuy nhiên, bạn sẽ phải triển khai các bộ truy cập get /set để tìm trong bộ sưu tập dữ liệu. Nếu bạn biết chỉ số nào thì mỗi giá trị sẽ ở, nó có thể đơn giản như

private List<int> Values = new List<int>(3);

public int Value1 {
    get => Values[0];
    set => Values[0] = value;
}

public int Value2 {
    get => Values[1];
    set => Values[1] = value;
}

Nếu bạn thực sự muốn đi theo tuyến phản chiếu ... bạn có thể tạo một thuộc tính để chỉ định thuộc tính nào sẽ bao gồm khi xác định tối đa

[AttributeUsage(AttributeTargets.Property)]
public class IncludeInMaxAttribute : Attribute
{
}

public class MyClass {
    [IncludeInMax]
    public int Value1 {get;set;}

    [IncludeInMax]
    public int Value2 {get;set;}

    public string AnotherValue {get;set;}

    public int GetMax()
    {
        int maxValue = int.MinValue;

        foreach (var prop in this.GetType().GetProperties())
        {
            if (prop.GetCustomAttribute<IncludeInMaxAttribute>() != null)
            {
                maxValue = (int) prop.GetValue(this);
            }
        }

        return maxValue;
    }
}
    
0
2019-05-08 16: 04: 34Z
nguồn đặt đây