C# 如何将两个列表合并为一个列表<;KeyValuePair<&燃气轮机>;?

C# 如何将两个列表合并为一个列表<;KeyValuePair<&燃气轮机>;?,c#,linq,lambda,C#,Linq,Lambda,有两个列表: List<string> files; List<Filter> filters; 列出文件; 列表过滤器; 我希望结果是这样的: List<KeyValuePair<string, Filter>> fileFilterMap; 列出文件过滤器映射; 我尝试了几种方法(lambda表达式,linq),但都失败了。 我真的不想要这个 for(int i=0;inewkeyvaluepair(文件[i],过滤器[i])) .To

有两个列表:

List<string> files;
List<Filter> filters;
列出文件;
列表过滤器;
我希望结果是这样的:

List<KeyValuePair<string, Filter>> fileFilterMap;
列出文件过滤器映射;
我尝试了几种方法(lambda表达式,linq),但都失败了。 我真的不想要这个

for(int i=0;i

方法。

您可以使用:

List<KeyValuePair<string, Filter>> fileFilterMap =
  Enumerable.Range(0, files.Count)
  .Select(i => new KeyValuePair<string, Filter>(files[i], filters[i]))
  .ToList();
列出文件过滤器映射=
可枚举的.Range(0,files.Count)
.Select(i=>newkeyvaluepair(文件[i],过滤器[i]))
.ToList();
或:

列出文件过滤器映射=
可枚举.Zip(
文件夹,
过滤器,
(文件,过滤器)=>新的KeyValuePair(文件,过滤器)
)
.ToList();

认为您的
过滤器
类包含属性Prop,在这里它是通过属性Prop进行条件化的,这是摘录

    public class Filter {
        public String Prop { get; set; }
    }
    static void Main(string[] args) {

        var strings = new List<String>();
        var filters = new List<Filter>();

        var result = strings.Select(x => new KeyValuePair<string, Filter>(x,filters.FirstOrDefault(y => y.Prop == x)))
            .ToList();

        Console.ReadLine();
    }
公共类过滤器{
公共字符串属性{get;set;}
}
静态void Main(字符串[]参数){
var strings=新列表();
var filters=新列表();
var result=strings.Select(x=>newkeyvaluepair(x,filters.FirstOrDefault(y=>y.Prop==x)))
.ToList();
Console.ReadLine();
}

这是一个可能的解决方案,尽管它不是很漂亮。。(它对文件中的每个项目进行索引查找,并且要求文件中的每个条目都是唯一的。)

List files=newlist();
列表过滤器=新列表();
列表文件过滤器映射=
files.ToDictionary(
file=>file,//键选择器
file=>过滤器[files.IndexOf(file)]//项选择器
).ToList();

假设您的意思是两个列表开始时彼此同步,那么

var fileFilterMap = files.Select((s, i) => new KeyValuePair<string, int>(s, filters[i])).ToList();
var fileFilterMap=files.Select((s,i)=>newkeyvaluepair(s,filters[i]).ToList();
会有用的

也就是说,(inti;i!=files.Count;++i)
有什么问题。我认为这是优越的(稍微快一点,更清楚一些)。

< P> >看一下。

List fileFilterMap=new List();
files.All(a=>{fileFilterMap.Add(newkeyvaluepair(a,filters[files.IndexOf(a)]);返回true;});
var fileFilterMap=files.Zip(filters,(file,filter)=>newkeyvaluepair(file,filter)).ToList();

您希望如何映射它们?索引0和索引0?为什么循环没有
?很可能它会比其他选择更具可读性和效率。人们似乎又开始喜欢循环了,因为他们不知道LINQ的所有特性。如果你看一下答案,大多数答案看起来都很神秘,但是这是一个带有Enumerable.Zip()@noah1989哇!好极了喜欢这个功能)我从来不知道。为什么要重新发明轮子?Enumerable.Zip就是这样做的,但有几个缺陷:例如,当files.Count>filters.Count时会发生什么?@noah1989:对,我没想到。如果用于.Net 4,我将添加它.Enumerable.Zip。有3.5或更低的价格吗?@odyodyys:是的,使用第一个选项。目前为止最喜欢的解决方案。干净利落!谢谢,我更喜欢这个答案。精确而简洁。。。谢谢你提起这个。。。
List<string> files = new List<string>();
List<Filter> filters = new List<Filter>();

List<KeyValuePair<string, Filter>> fileFilterMap =
     files.ToDictionary(
          file => file, // key selector
          file => filters[files.IndexOf(file)] // item selector
     ).ToList();
var fileFilterMap = files.Select((s, i) => new KeyValuePair<string, int>(s, filters[i])).ToList();
var fileFilterMap = Enumerable.Zip(files, filters, (file, filter) => new KeyValuePair(file, filter));
List<KeyValuePair<string, Filter>> fileFilterMap = new List<KeyValuePair<string, Filter>>();
files.All(a => { fileFilterMap.Add(new KeyValuePair<string, Filter>(a, filters[files.IndexOf(a)])); return true; });
var fileFilterMap = files.Zip(filters, (file, filter) => new KeyValuePair<string,Filter>(file, filter)).ToList();