사용 LINQ 을 연결하는 여러 행에 하나의 행 CSV(속)
-
03-07-2019 - |
문제
내가 찾는 이 LINQ 에 해당하는 Sybase 목록()또는 MySQL 의 group_concat()
그것은 것으로 변환:
User Hobby
--------------
Bob Football
Bob Golf
Bob Tennis
Sue Sleeping
Sue Drinking
하기:
User Hobby
--------------
Bob Football, Golf, Tennis
Sue Sleeping, Drinking
해결책
는 GroupBy 연산자입니다.당신은 당신을 사용하여 LINQ to Objects?
예를 들어 다음과 같습니다.
using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
static void Main()
{
var users = new[]
{
new { User="Bob", Hobby="Football" },
new { User="Bob", Hobby="Golf" },
new { User="Bob", Hobby="Tennis" },
new { User="Sue", Hobby="Sleeping" },
new { User="Sue", Hobby="Drinking" },
};
var groupedUsers = users.GroupBy(user => user.User);
foreach (var group in groupedUsers)
{
Console.WriteLine("{0}: ", group.Key);
foreach (var entry in group)
{
Console.WriteLine(" {0}", entry.Hobby);
}
}
}
}
행하는 그룹화할 수 있습을 관리하는 나머지 자신?
다른 팁
이 솔루션이 도움이되는지 확인하십시오.
List<User> users = new List<User>()
{
new User {Name = "Bob", Hobby = "Football" },
new User {Name = "Bob", Hobby = "Golf"},
new User {Name = "Bob", Hobby = "Tennis"},
new User {Name = "Sue", Hobby = "Sleeping"},
new User {Name = "Sue", Hobby = "Drinking"}
};
var groupedUsers = from u in users
group u by u.Name into g
select new
{
Name = g.First<User>().Name,
Hobby = g.Select(u => u.Hobby)
};
foreach (var user in groupedUsers)
{
Console.WriteLine("Name: {0}", user.Name);
foreach (var hobby in user.Hobby)
{
Console.WriteLine("Hobby: {0}", hobby);
}
}
re _concat
귀하의 질문의 측면, 사용 :
static class EnumerableExtensions
{
public static String AsJoined( this IEnumerable<String> enumerable )
{
return AsJoined( enumerable, "," );
}
public static String AsJoined( this IEnumerable<String> enumerable, String separator )
{
return String.Join( separator, enumerable.ToArray() );
}
}
Bruno Conde의 Foreach와 Jon Skeet의 답변은 다음과 같습니다.
Console.WriteLine( "User:\tHobbies");
foreach ( var group in groupedUsers )
Console.WriteLine( "{0}:\t{1}", group.Key, group.Select( g => g.Hobby ).AsJoined( ", " ) );
... 그리고 당신은 당신이 요청한 정확한 결과 출력 형식을 얻을 것입니다 (예, 다른 사람들이 이미 당신의 문제를 해결했지만 저항하기가 어렵다는 것을 알고 있습니다!)
그렇지 않으면 우리는 다음을 수행 할 수 있습니다.
var users = new[]
{
new { User="Bob", Hobby="Football" },
new { User="Bob", Hobby="Golf" },
new { User="Bob", Hobby="Tennis" },
new { User="Sue", Hobby="Sleeping" },
new { User="Sue", Hobby="Drinking" },
};
var userList = users.ToList();
var ug = (from user in users
group user by user.User into groupedUserList
select new { user = groupedUserList.Key, hobby = groupedUserList.Select(g =>g.Hobby)});
var ug2 = (from groupeduser in ug
select new{ groupeduser.user, hobby =string.Join(",", groupeduser.hobby)});
하나의 LINQ 문에서 수행합니다. 코드를 추천하는 방법은 없지만 코드가 수행 할 수 있음을 보여줍니다.
var groupedUsers = from user in users
group user by user.User into userGroup
select new
{
User = userGroup.Key,
userHobies =
userGroup.Aggregate((a, b) =>
new { User = a.User, Hobby = (a.Hobby + ", " + b.Hobby) }).Hobby
}
;
foreach (var x in groupedUsers)
{
Debug.WriteLine(String.Format("{0} {1}", x.User, x.userHobies));
}
모든 대답은 충분하지 않습니다.
이것은 DB 쿼리이기 때문에 우리 모두는 기억에 따라 그렇게합니다.
Diff는 메모리의 일부 작업이 표현식을 저장하기 위해 트랜스 할 수없는 오류가 발생한다는 것입니다.
var list = db.Users.GroupBy(s=>s.User).
select(g=>new{user=g.Key,hobbys=g.select(s=>s.Hobby)}); // you can just do that from db
var result=list.ToList(); // this is important,to query data to memory;
var result2 = result.select(g=>new{user=g.Key,hobbyes=string.join(",",g.hobbyes)}; //then,do what you love in memory
제휴하지 않습니다 StackOverflow