C# Linq检查集合中的值是否相等,并将值分配给其他集合

C# Linq检查集合中的值是否相等,并将值分配给其他集合,c#,linq,C#,Linq,我有一个叫做消息和历史的模型。历史有另一种模式,即列表 消息模型具有如下属性 MessageId,Title,Content,FileID,FileName 历史模型: Title,Content,List<File> MessageModel数据如下所示, MessageId标题内容FileId文件名 101 场景:单个messageid可以有多个fileid、filename或没有fileid、filename 我想将消息标题的不同值、内容分配给历史模型标题、内容和文件I

我有一个叫做消息和历史的模型。历史有另一种模式,即列表

消息模型具有如下属性

MessageId,Title,Content,FileID,FileName 
历史模型

Title,Content,List<File> 
MessageModel数据如下所示, MessageId标题内容FileId文件名 101

场景:单个messageid可以有多个fileid、filename或没有fileid、filename

我想将消息标题的不同值、内容分配给历史模型标题、内容和文件ID、文件名分配给文件模型列表

我的历史模型应该具有如下值:

Title     Content       Fileid  FileName
1st title   1st content    1     User.pdf
                            2    Log.txt
                            3    manual.doc
2nd title   2nd content    4     dummy.txt
3rd title   3rd content   Null   Null
4th title   4th content   Null   Null
Messageid在这里是唯一的。 我学会了用linq编写简单的查询。对于上述场景,任何人都可以提出建议。

您可以使用

假设
messages
是一个IEnumerable,则以下内容应满足您的要求:

var history = messages.GroupBy(m => new { m.Title, m.Content }, (group, data) => new HistoryModel()
{
    Title = group.Title,
    Content = group.Content,
    Files = data.Select(k => new File() 
                                { 
                                    FileId = k.Fileid, 
                                    FileName = k.FileName
                                }
                        ).ToList(),
});
这基本上是说,根据消息的
标题
内容
属性对消息进行分组。对于每个组,lambda被称为传入
group
,这是一种匿名类型,包含组的详细信息(即标题和内容)和
data
,这是一种
IEnumerable
,包含组中的每个
MessageModel
。由此我们可以构建一个
HistoryModel
列表

操作后编辑问题

历史记录
中,上述内容应仅提供4个元素。我用来测试这一点的完整清单是:

class MessageModel
{
    public string MessageId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public string Fileid { get; set; }
    public string FileName { get; set; }

    public MessageModel(string m, string t, string c, string f, string f2)
    {
        MessageId = m;
        Title = t;
        Content = c;
        Fileid = f;
        FileName = f2;
    }
}

class HistoryModel
{
    public string Title { get; set; }
    public string Content { get; set; }
    public List<File> Files { get; set; }
}

class File
{
    public string FileId { get; set; }
    public string FileName { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<MessageModel> messages = new List<MessageModel>();
        messages.Add(new MessageModel("100", "1st title", "1st content", "1", "User.pdf"));
        messages.Add(new MessageModel("100", "1st title", "1st content", "2", "Log.txt"));
        messages.Add(new MessageModel("100", "1st title", "1st content", "3", "manual.doc"));
        messages.Add(new MessageModel("101", "2nd title", "2nd content", "4", "dummy.txt"));
        messages.Add(new MessageModel("102", "3rd title", "3rd content", null, null));
        messages.Add(new MessageModel("103", "4th title", "4th content", null, null));

        var history = messages.GroupBy(m => new { m.Title, m.Content }, (group, data) => new HistoryModel()
        {
            Title = group.Title,
            Content = group.Content,
            Files = data.Select(k => new File()
            {
                FileId = k.Fileid,
                FileName = k.FileName
            }).ToList(),
        });

        foreach (var h in history)
        {
            Console.WriteLine(h.Title + " " + h.Content);

            foreach (var file in h.Files)
            {
                Console.WriteLine("\t" + file.FileId + " " + file.FileName);
            }
        }

        Console.ReadLine();
    }

}
类消息模型
{
公共字符串MessageId{get;set;}
公共字符串标题{get;set;}
公共字符串内容{get;set;}
公共字符串Fileid{get;set;}
公共字符串文件名{get;set;}
公共消息模型(字符串m、字符串t、字符串c、字符串f、字符串f2)
{
MessageId=m;
Title=t;
内容=c;
Fileid=f;
文件名=f2;
}
}
类历史模型
{
公共字符串标题{get;set;}
公共字符串内容{get;set;}
公共列表文件{get;set;}
}
类文件
{
公共字符串FileId{get;set;}
公共字符串文件名{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
列表消息=新列表();
添加(新的MessageModel(“100”,“第一个标题”,“第一个内容”,“1”,“User.pdf”));
添加(新的MessageModel(“100”,“第一个标题”,“第一个内容”,“2”,“Log.txt”);
添加(新的MessageModel(“100”,“第一个标题”,“第一个内容”,“3”,“manual.doc”));
添加(新的MessageModel(“101”、“第二个标题”、“第二个内容”、“4”、“dummy.txt”);
添加(新的MessageModel(“102”,“第三个标题”,“第三个内容”,null,null));
添加(新的MessageModel(“103”,“第四个标题”,“第四个内容”,null,null));
var history=messages.GroupBy(m=>new{m.Title,m.Content},(group,data)=>newhistorymodel()
{
Title=组。Title,
Content=group.Content,
Files=data.Select(k=>newfile()
{
FileId=k.FileId,
FileName=k.FileName
}).ToList(),
});
foreach(历史上的var h)
{
Console.WriteLine(h.Title+“”+h.Content);
foreach(h.Files中的var文件)
{
Console.WriteLine(“\t”+file.FileId+”+file.FileName);
}
}
Console.ReadLine();
}
}
上述操作产生输出:

第一个标题第一个内容
1 User.pdf
2 Log.txt
3手动文档
第二标题第二内容
4 dummy.txt
第三标题第三内容

第4标题第4内容


可以使用GROUPBY子句对公共属性(MessageId、标题和内容)进行分组。然后将其用作ke,然后可以使用Select子句构建HistoryModel

下面的完整示例(注意.Dump()来自LinqPad)

void Main()
{
var messages=新列表
{
新消息模型(100,“第一个标题”,“第一个内容”,1,“User.pdf”),
新消息模型(100,“第一个标题”,“第一个内容”,2,“Log.txt”),
新消息模型(100,“第一个标题”,“第一个内容”,3,“manual.doc”),
新的消息模型(101,“第二个标题”,“第二个内容”,4,“dummy.txt”),
新消息模型(102,“第三标题”,“第三内容”),
新消息模型(103,“第三标题”,“第三内容”)
};
var groupedMessages=
messages.GroupBy(x=>new{x.MessageId,x.Title,x.Content})
.选择(x=>new HistoryModel
{
MessageId=x.Key.MessageId,
Title=x.Key.Title,
Content=x.Key.Content,
Files=新列表(x.Where(f=>f.FileId!=null)
.Select(g=>newfilemodel(g.FileId,g.FileName)))
});
groupedMessages.Dump();
}
//在此处定义其他方法和类
公共类消息模型
{
public int MessageId{get;set;}
公共字符串标题{get;set;}
公共字符串内容{get;set;}
public int?FileId{get;set;}
公共字符串文件名{get;set;}
public MessageModel(int-id、字符串标题、字符串内容、int?fileId=null、字符串fileName=null)
{
MessageId=id;
头衔=头衔;
内容=内容;
FileId=FileId;
FileName=文件名;
}
}
公共类历史模型
{
public int MessageId{get;set;}
公共字符串标题{get;set;}
公共字符串内容{get;set;}
公共列表文件{get;set;}=new List();
}
公共类文件模型
{
public int?FileId{get;set;}
公共字符串文件名{get;set;}
公共文件模型(int?id,字符串名称)
{
FileId=id;
FileName=名称;
}
}

执行代码后,我的messagemodel中有6条记录historymodel也有6条记录,但我的预期是4条记录beca
var history = messages.GroupBy(m => new { m.Title, m.Content }, (group, data) => new HistoryModel()
{
    Title = group.Title,
    Content = group.Content,
    Files = data.Select(k => new File() 
                                { 
                                    FileId = k.Fileid, 
                                    FileName = k.FileName
                                }
                        ).ToList(),
});
class MessageModel
{
    public string MessageId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public string Fileid { get; set; }
    public string FileName { get; set; }

    public MessageModel(string m, string t, string c, string f, string f2)
    {
        MessageId = m;
        Title = t;
        Content = c;
        Fileid = f;
        FileName = f2;
    }
}

class HistoryModel
{
    public string Title { get; set; }
    public string Content { get; set; }
    public List<File> Files { get; set; }
}

class File
{
    public string FileId { get; set; }
    public string FileName { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<MessageModel> messages = new List<MessageModel>();
        messages.Add(new MessageModel("100", "1st title", "1st content", "1", "User.pdf"));
        messages.Add(new MessageModel("100", "1st title", "1st content", "2", "Log.txt"));
        messages.Add(new MessageModel("100", "1st title", "1st content", "3", "manual.doc"));
        messages.Add(new MessageModel("101", "2nd title", "2nd content", "4", "dummy.txt"));
        messages.Add(new MessageModel("102", "3rd title", "3rd content", null, null));
        messages.Add(new MessageModel("103", "4th title", "4th content", null, null));

        var history = messages.GroupBy(m => new { m.Title, m.Content }, (group, data) => new HistoryModel()
        {
            Title = group.Title,
            Content = group.Content,
            Files = data.Select(k => new File()
            {
                FileId = k.Fileid,
                FileName = k.FileName
            }).ToList(),
        });

        foreach (var h in history)
        {
            Console.WriteLine(h.Title + " " + h.Content);

            foreach (var file in h.Files)
            {
                Console.WriteLine("\t" + file.FileId + " " + file.FileName);
            }
        }

        Console.ReadLine();
    }

}
void Main()
{
    var messages = new List<MessageModel>
    {
        new MessageModel(100,"1st title","1st content", 1,"User.pdf"),
        new MessageModel(100,"1st title","1st content",  2,"Log.txt"),
        new MessageModel(100,"1st title","1st content", 3,"manual.doc"),
        new MessageModel(101,"2nd title","2nd content", 4,"dummy.txt"),   
        new MessageModel(102,"3rd title","3rd content" ),
        new MessageModel(103,"3rd title","3rd content")
    };

    var groupedMessages = 
    messages.GroupBy(x=> new {x.MessageId, x.Title, x.Content})
            .Select(x=> new HistoryModel
                          {
                            MessageId =  x.Key.MessageId,
                            Title = x.Key.Title,
                            Content = x.Key.Content,
                            Files = new List<FileModel>(x.Where( f=>  f.FileId != null)
                                                         .Select( g => new FileModel(g.FileId,  g.FileName)))
                          });

    groupedMessages.Dump();
}

// Define other methods and classes here
public class MessageModel
{
    public int MessageId {get; set;}

    public string Title {get; set;}

    public string Content {get; set;}

    public int? FileId {get; set;}

    public string FileName {get; set;}

    public MessageModel(int id, string title, string content, int? fileId = null, string fileName= null)
    {
        MessageId = id;
        Title =  title;
        Content = content;
        FileId = fileId;
        FileName = fileName;
    }
}

public class HistoryModel
{
    public int MessageId {get; set;}

    public string Title {get; set;}

    public string Content {get; set;}

    public List<FileModel> Files{get; set;} = new List<FileModel>();

}

public class FileModel
{
    public int? FileId {get; set;}

    public string FileName {get; set;}

    public FileModel(int? id, string name)
    {
        FileId = id;
        FileName = name;
    }
}