-2

songDetails と savedSongs のフィールドを一緒にマージしたいと思います。どうすればいいですか?聞いたことはあります.Zip()が、使い方がよくわかりません。

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

        return View();
    }

編集: songDetails文字列フィールドがありsavedSongsます: Category、AlbumName、BandName、ただし、songDetails にはこれらにデータがあります。したがって、これらの null 以外のデータ フィールドを、同じインデックス内の savedSongs null フィールドとマージしたいと考えています。

4

1 に答える 1

1

ZIP の動作方法は Aggregate メソッドに似ています。正直なところ、それはあなたが望んでいることではないと思います。

ZIP がどのように機能するかを例に挙げて、その理由を説明します。A と B が整数の配列であるとします。

var A = new [] { 1, 3 };
var B = new [] { 2, 4 };

A & B を圧縮しても生成されないもの:

C = {1, 2, 3 ,4};

C# の単純な ZIP は、2 つの値を調べた後に 1 つの値を返します。.Net 4.0 で ZIP を使用してできることは次のとおりです。

次の関数があるとします。

Max & Min と A & B で Zip を使用し、Max または Min を適用したい。ここに結果があります。

Zip(A,B, Max) = { 2, 4}
Zip(A,B, Min) = { 1, 3}

MultiplyFirstBySecond という別の関数があれば、次のようになります。

Zip(A,B, MultiplyFirstBySecond ) = {2, 12}

ご覧のとおり、ZIP は実際にはマージされません。Aggregate に似ていますが、1 つではなく 2 つのコレクションにまたがって動作します。

あなたが望むのは、Song DetailsからUploaded Songまで、あるオブジェクトから別のオブジェクトにフィールドをマージまたはコピーすることです。

私はあなたを助けるかもしれない小さなスニペットを含めました. 実装の詳細をほとんど提供しませんでした。私はあなたがあなたのプロジェクトについてあまり詳細を漏らしたくないと思います、そしてそれは問題ありません:)

とにかく、ここにあなたを助けるための私の試みがあります。

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);
    }
}

乾杯と幸運を!

于 2015-07-24T20:13:35.507 に答える