데이터 테이블에서 열의 최소값과 최대 값을 선택하는 방법은 무엇입니까?
다음 데이터 테이블 열의 경우 최소값과 최대 값을 얻는 가장 빠른 방법은 무엇입니까?
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 Min
와 Max
확장을 사용하면 두 번 반복해야하기 때문에 항상 느려집니다. 잠재적으로 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를 가장 좋아한다고 생각했습니다.
'Development Tip' 카테고리의 다른 글
데이터 프레임에서 그룹별로 고유 / 고유 값 계산 (0) | 2020.12.09 |
---|---|
Matplotlib 플롯은 노쇼입니다. (0) | 2020.12.09 |
복잡한 텍스트 파일에서 쉘 변수를 대체하는 방법 (0) | 2020.12.09 |
momentjs로 Angular Material에서 md-datepicker의 형식 변경 (0) | 2020.12.09 |
UIMenuController가 표시되지 않음 (0) | 2020.12.09 |