[C#] Linq의 목록에서 여러 필드 선택

ASP.NET C #에는 구조체가 있습니다.

public struct Data
{
    public int item1;
    public int item2;
    public int category_id;
    public string category_name;
}

그 목록이 있습니다. 내가 선택하려는 category_idcategory_name실행, DISTINCT그리고 마지막으로 ORDERBY에를 category_name.

여기 내가 지금 가진 것입니다 :

List<Data> listObject = getData();
string[] catNames = listObject
                    .Select(i=> i.category_name)
                    .Distinct()
                    .OrderByDescending(s => s)
                    .ToArray();

이것은 분명히 카테고리 이름을 얻습니다. 내 질문은 여러 필드를 어떻게 구할 수 있으며 어떤 데이터 구조를 (가 아닌 string[]) 에 저장 합니까?

편집하다

구조체 목록을 사용하는 것은 돌로 설정되어 있지 않습니다. 선택하기 쉽도록 백업 데이터 구조를 변경하는 것이 좋습니다 (많은 글을 쓸 것입니다).



답변

익명 형식을 사용하면 나중에 코드에서 강력하게 형식화 된 데이터 구조로 임의의 필드를 선택할 수 있습니다.

var cats = listObject
    .Select(i => new { i.category_id, i.category_name })
    .Distinct()
    .OrderByDescending(i => i.category_name)
    .ToArray();

나중에 사용하기 위해 저장해야하므로 GroupBy 연산자를 사용할 수 있습니다.

Data[] cats = listObject
    .GroupBy(i => new { i.category_id, i.category_name })
    .OrderByDescending(g => g.Key.category_name)
    .Select(g => g.First())
    .ToArray();


답변

var selectedCategories =
    from value in
        (from data in listObject
        orderby data.category_name descending
        select new { ID = data.category_id, Name = data.category_name })
    group value by value.Name into g
    select g.First();

foreach (var category in selectedCategories) Console.WriteLine(category);

편집 : 더 LINQ-ey로 만들었습니다!


답변

익명 유형을 사용할 수 있습니다.

.Select(i => new { i.name, i.category_name })

컴파일러와 클래스에 대한 코드 생성 namecategory_name해당 클래스의 속성과 반환 인스턴스를. 속성 이름을 수동으로 지정할 수도 있습니다.

i => new { Id = i.category_id, Name = i.category_name }

임의의 수의 속성을 가질 수 있습니다.


답변

다양한 예에서 위와 같이 linq Select를 사용하여 여러 필드를 선택할 수 있으며 이는 익명 유형으로 반환됩니다. 이 익명 유형을 피하려면 간단한 트릭이 있습니다.

var items = listObject.Select(f => new List<int>() { f.Item1, f.Item2 }).SelectMany(item => item).Distinct();

나는 이것이 당신의 문제를 해결한다고 생각합니다.


답변

이하는 일이다 익명 형식이 매우 적합하다. 사용법에서 유추하여 컴파일러가 자동으로 생성 한 유형의 객체를 반환 할 수 있습니다.

구문은 다음과 같은 형식입니다.

new { Property1 = value1, Property2 = value2, ... }

귀하의 경우 다음과 같은 것을 시도하십시오.

var listObject = getData();
var catNames = listObject.Select(i =>
    new { CatName = i.category_name, Item1 = i.item1, Item2 = i.item2 })
    .Distinct().OrderByDescending(s => s).ToArray();


답변

var result = listObject.Select( i => new{ i.category_name, i.category_id } )

익명 형식을 사용하므로 식의 결과 형식을 미리 알 수 없으므로 var 키워드를 사용해야합니다.


답변

(from i in list
 select new { i.category_id, i.category_name })
 .Distinct()
 .OrderBy(i => i.category_name);