Development Tip

데이터 테이블에서 열의 최소값과 최대 값을 선택하는 방법은 무엇입니까?

yourdevel 2020. 12. 9. 21:50
반응형

데이터 테이블에서 열의 최소값과 최대 값을 선택하는 방법은 무엇입니까?


다음 데이터 테이블 열의 경우 최소값과 최대 값을 얻는 가장 빠른 방법은 무엇입니까?

AccountLevel  
0  
1  
2  
3 

int minAccountLevel = int.MaxValue;
int maxAccountLevel = int.MinValue;
foreach (DataRow dr in table.Rows)
{
    int accountLevel = dr.Field<int>("AccountLevel");
    minAccountLevel = Math.Min(minAccountLevel, accountLevel);
    maxAccountLevel = Math.Max(maxAccountLevel, accountLevel);
}

예, 이것이 정말 가장 빠른 방법입니다. Linq MinMax확장을 사용하면 두 번 반복해야하기 때문에 항상 느려집니다. 잠재적으로 Linq를 사용할 수 Aggregate있지만 구문은 이미 이것보다 훨씬 더 예쁘지는 않을 것입니다.


데이터 테이블에 대한보다 쉬운 접근 방식은 다음과 같습니다.

int minLavel = Convert.ToInt32(dt.Compute("min([AccountLevel])", string.Empty));

LINQ를 사용하십시오. 행 컬렉션을 IEnumerable로 변환하는 한 데이터 테이블에서 잘 작동합니다.

List<int> levels = AccountTable.AsEnumerable().Select(al => al.Field<int>("AccountLevel")).Distinct().ToList();
int min = levels.Min();
int max = levels.Max();

구문을 수정하기 위해 편집되었습니다. DataTables에서 LINQ를 사용할 때 까다 롭고 집계 함수도 재미 있습니다.

예, 하나의 쿼리로 수행 할 수 있지만 결과 목록을 생성 한 다음 .Min () 및 .Max ()를 별도의 명령문에서 집계 함수로 사용해야합니다.


이것은 나를 위해 잘 작동했습니다.

int  max = Convert.ToInt32(datatable_name.AsEnumerable()
                        .Max(row => row["column_Name"]));

이를 수행하는 가장 효율적인 방법 (믿거 나 말거나)은 두 개의 변수를 만들고 for루프를 작성하는 것 입니다.


var answer = accountTable.Aggregate(new { Min = int.MinValue, Max = int.MaxValue }, 
                                        (a, b) => new { Min = Math.Min(a.Min, b.Field<int>("AccountLevel")),
                                                        Max = Math.Max(a.Max, b.Field<int>("AccountLevel")) });
int min = answer.Min;
int max = answer.Max;

1 회 반복, linq 스타일 :)


이를 수행하는 또 다른 방법은

int minLavel = Convert.ToInt32(dt.Select("AccountLevel=min(AccountLevel)")[0][0]);

성능 부분은 확실하지 않지만 올바른 출력을 제공합니다.


var min = dt.AsEnumerable().Min(row => row["AccountLevel"]);
var max = dt.AsEnumerable().Max(row => row["AccountLevel"]);

Session["MinDate"] = dtRecord.Compute("Min(AccountLevel)", string.Empty);
Session["MaxDate"] = dtRecord.Compute("Max(AccountLevel)", string.Empty);

성능면에서 이것은 비슷해야합니다. Select 문 및 Sort를 사용하여 목록을 가져온 다음 정렬 순서에 따라 첫 번째 또는 마지막을 선택합니다.

var col = dt.Select("AccountLevel", "AccountLevel ASC");

var min = col.First();
var max = col.Last();

내 솔루션이 이전 답변과 성능 현명한 비교 방법을 모르겠습니다.

초기 질문은 다음과 같습니다. DataTable 개체에서 최소값과 최대 값을 얻는 가장 빠른 방법은 무엇입니까?이 방법 중 하나 일 수 있습니다.

DataView view = table.DefaultView;
view.Sort = "AccountLevel";
DataTable sortedTable = view.ToTable();
int min = sortedTable.Rows[0].Field<int>("AccountLevel");
int max = sortedTable.Rows[sortedTable.Rows.Count-1].Field<int>("AccountLevel");

반복하지 않고 동일한 결과를 얻을 수있는 쉬운 방법입니다. 그러나 성능은 이전 답변과 비교되어야합니다. 내가 Cylon Cats를 가장 좋아한다고 생각했습니다.

참고URL : https://stackoverflow.com/questions/2442525/how-to-select-min-and-max-values-of-a-column-in-a-datatable

반응형