Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将列表合并在一起_C#_Linq_Linq Extensions - Fatal编程技术网

C#将列表合并在一起

C#将列表合并在一起,c#,linq,linq-extensions,C#,Linq,Linq Extensions,我想将songDetails和SavedSong的字段合并在一起。我该怎么做? 我听说过.Zip(),但我不确定如何使用它 [HttpPost] public ActionResult Upload(IEnumerable<UploadedSong> songDetails) { IEnumerable<UploadedSong> savedSongs = (IEnumerable<UploadedSong>)(Sess

我想将songDetails和SavedSong的字段合并在一起。我该怎么做? 我听说过
.Zip()
,但我不确定如何使用它

    [HttpPost]
    public ActionResult Upload(IEnumerable<UploadedSong> songDetails)
    {
        IEnumerable<UploadedSong> savedSongs = (IEnumerable<UploadedSong>)(Session["UserSongs"]);            

        return View();
    }
[HttpPost]
公共操作结果上载(IEnumerable songDetails)
{
IEnumerable savedSongs=(IEnumerable)(会话[“用户歌曲]);
返回视图();
}
编辑:
songdestails
savedSongs
有字符串字段:Category、AlbumName、BandName,但在songdestails中有数据。因此,我想将这些非空数据字段与同一索引中的savedSongs空字段合并。

ZIP的工作方式类似于聚合方法。老实说,我不认为那是你想要的

我将用一个例子来说明为什么ZIP是如何工作的。给定A和B是整数数组

var A = new [] { 1, 3 };
var B = new [] { 2, 4 };
压缩A&B不会产生:

C = {1, 2, 3 ,4};
C#simple中的ZIP在查看两个值后返回一个值。下面是在.NET4.0中使用ZIP可以做的事情

假设我们有以下功能:

最大值和最小值,并在A&B上使用Zip,我想应用最大值或最小值。下面是结果

Zip(A,B, Max) = { 2, 4}
Zip(A,B, Min) = { 1, 3}
如果我有另一个名为MultiplyFirstBySecond的函数,我会得到:

Zip(A,B, MultiplyFirstBySecond ) = {2, 12}
正如您所看到的,ZIP实际上并没有合并。它的行为更像聚合,但跨两个集合而不是一个集合

您需要的是将字段从一个对象合并或复制到另一个对象,从歌曲详细信息到上传的歌曲

我提供了一个小片段,可能会对您有所帮助。您几乎没有给出实现细节。我想你不想透露太多关于你项目的细节,这很好:)

无论如何,这是我试图帮助你的地方

using System.IO;
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{ 
    class UploadedSong { 
        public string Author{get;set;}
        public string Name{get;set;}
        public float Length{get;set;}
        public string Path{get;set;}
        public byte[] SizeInBytes{get;set;}
    }

    public void UpdateSongDetails(IEnumerable<UploadedSong> uploadedSongs, IEnumerable<UploadedSong> songDetails) { 
        // Note that this might blow up if you have duplicate song names
        // You gave very little to work with so my preconditions are weak

        var lookupDetails = songDetails.ToDictionary(song => song.Name, song => song);

        foreach(var uploadedSong in uploadedSongs) {
            var key = uploadedSong.Name;
            if(lookupDetails.ContainsKey(key)) {
                var details = lookupDetails[key];
                uploadedSong.Author = details.Author; 
                // ... more details here
            }
        }
    }

    static void Main()
    {
        // I am assuming that song details is something you populate from some reliable source
        // but for simpilicity I will just declare it.
        var songDetails = new List<UploadedSong>(); 
        var uploadedSongs = (IEnumerable<UploadedSong>)(Session["UserSongs"]);
        UpdateSongDetails(uploadedSongs, songDetails);
    }
}
使用System.IO;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
班级计划
{ 
类上载歌曲{
公共字符串作者{get;set;}
公共字符串名称{get;set;}
公共浮点长度{get;set;}
公共字符串路径{get;set;}
公共字节[]大小字节{get;set;}
}
public void UpdateSongDetails(IEnumerable uploadedSongs,IEnumerable songDetails){
//请注意,如果您有重复的歌曲名称,这可能会爆炸
//你几乎没给我多少钱,所以我的先决条件很弱
var lookupDetails=songdestails.ToDictionary(song=>song.Name,song=>song);
foreach(上传歌曲中的var uploadedSong){
var key=uploadedSong.Name;
if(lookupDetails.ContainsKey(键)){
var details=lookupDetails[key];
uploadedSong.Author=details.Author;
//…这里有更多细节
}
}
}
静态void Main()
{
//我假设歌曲的细节是从可靠的来源填充的
//但为了简单起见,我只宣布它。
var songDetails=新列表();
var uploadedshongs=(IEnumerable)(会话[“用户歌曲]);
更新歌曲详情(上传歌曲、歌曲详情);
}
}

干杯,祝你好运

你说的“合并”是什么意思?你知道合并的标准吗?我不知道。向我们展示你的输入和预期输出,以及你尝试过的不起作用的东西。