[c#] LINQ를 사용하여 DataTable에서 고유하고 순서가 지정된 이름 목록을 얻으려면 어떻게해야합니까?

나는이 DataTableName열입니다. 알파벳순으로 정렬 된 고유 한 이름 모음을 생성하고 싶습니다. 다음 쿼리는 order by 절을 무시합니다 .

var names =
    (from DataRow dr in dataTable.Rows
    orderby (string)dr["Name"]
    select (string)dr["Name"]).Distinct();

orderby시행되지 않습니까?



답변

더 읽기 쉽고 유지 관리하기 쉽도록 여러 LINQ 문으로 분할 할 수도 있습니다.

  1. 먼저 데이터를 새 목록으로 선택 x1하고 원하는 경우 프로젝션을 수행합니다.
  2. 다음으로 필요한 구별을 사용하여 에서 x1로 구별 목록을 작성하십시오.x2
  3. 마지막으로,에서 x2x3, 원하는대로 정렬하여 정렬 된 목록을 만듭니다.

답변

문제는 Distinct 연산자가 값의 원래 순서를 유지하도록 허용하지 않는다는 것입니다.

따라서 쿼리는 다음과 같이 작동해야합니다.

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );


답변

var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);


답변

다음을 시도하십시오.

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);


답변

다음을 시도하십시오

var names = (from dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy(name => name);

이것은 필요한 것을 위해 작동합니다.


답변

요약하자면 모든 답변에는 공통점이 있습니다.

OrderBy는 최종 작업이어야합니다.


답변

다음과 같이 사용할 수 있습니다.

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);