如何将对象列表分组为字典?

时间:2019-06-26 10:17:13

标签: c# linq

我有以下列表:

public class Item
{
   public int FirstId { get; set; }
   public int SecondId { get; set; }
   public int Sequence { get; set; }
}

示例列表可能是:

var list = new List<Item>();
list.Add( new Item{ FirstId = 1, SecondId = 10, Sequence = 1 } );
list.Add( new Item{ FirstId = 2, SecondId = 10, Sequence = 1 } );
list.Add( new Item{ FirstId = 2, SecondId = 11, Sequence = 2 } );
list.Add( new Item{ FirstId = 3, SecondId = 10, Sequence = 1 } );
list.Add( new Item{ FirstId = 4, SecondId = 10, Sequence = 2 } );
list.Add( new Item{ FirstId = 4, SecondId = 11, Sequence = 1 } );

我需要按FirstId对项目进行分组,并按Sequence对每个组进行排序。结果应该是:

Dictionary<int, IEnumerable<int>>();

其中键是FirstId,值是按Sequence排序的SecondId列表。因此,以上结果应为:

Key (int), Value (IEnumerable<int>)
1, (10)
2, (10, 11)
3, (10)
4, (11, 10)

目前,我有以下内容:

var items = from t in tags
            group t by t.FirstId into g
            orderby g.Key
            select g;

如何在上述内容上扩展以实现所需的内容?

1 个答案:

答案 0 :(得分:4)

您可以使用方法@if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem sdkmanager startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME%.. @rem Add default JVM options here. You can also use JAVA_OPTS and SDKMANAGER_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.." @rem find Java from Android Studio @rem Find java.exe if defined ANDROID_STUDIO_JAVA_HOME goto findJavaFromAndroidStudioJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init goto findJavaNormally :findJavaFromAndroidStudioJavaHome set JAVA_HOME=%ANDROID_STUDIO_JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto init goto findJavaNormally @rem java from java home @rem Find java.exe :findJavaNormally if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init goto javaError :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto init goto javaDirectoryError :javaError echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :javaDirectoryError echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :init @rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args :win9xME_args @rem Slurp the command line arguments. set CMD_LINE_ARGS= set _SKIP=2 :win9xME_args_slurp if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\lib\dvlib-26.0.0-dev.jar;%APP_HOME%\lib\jimfs-1.1.jar;%APP_HOME%\lib\jsr305-1.3.9.jar;%APP_HOME%\lib\repository-26.0.0-dev.jar;%APP_HOME%\lib\j2objc-annotations-1.1.jar;%APP_HOME%\lib\layoutlib-api-26.0.0-dev.jar;%APP_HOME%\lib\gson-2.3.jar;%APP_HOME%\lib\httpcore-4.2.5.jar;%APP_HOME%\lib\commons-logging-1.1.1.jar;%APP_HOME%\lib\commons-compress-1.12.jar;%APP_HOME%\lib\annotations-26.0.0-dev.jar;%APP_HOME%\lib\error_prone_annotations-2.0.18.jar;%APP_HOME%\lib\animal-sniffer-annotations-1.14.jar;%APP_HOME%\lib\httpclient-4.2.6.jar;%APP_HOME%\lib\commons-codec-1.6.jar;%APP_HOME%\lib\common-26.0.0-dev.jar;%APP_HOME%\lib\kxml2-2.3.0.jar;%APP_HOME%\lib\httpmime-4.1.jar;%APP_HOME%\lib\annotations-12.0.jar;%APP_HOME%\lib\sdklib-26.0.0-dev.jar;%APP_HOME%\lib\guava-22.0.jar @rem Execute sdkmanager "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable SDKMANAGER_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%SDKMANAGER_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega 。尝试以下代码:

ToDictionary

Demo