如何将两个列表组合到List <keyvaluepair <>&gt;?</keyvaluepair <>

时间:2011-12-12 15:03:34

标签: c# linq lambda

有两个清单:

List<string> files;
List<Filter> filters;

我希望结果如下:

List<KeyValuePair<string, Filter>> fileFilterMap;

我尝试了几种东西(lambda表达式,linq)但是失败了。

我真的不想要

for(int i = 0; i< files.count; i++)

方法

7 个答案:

答案 0 :(得分:13)

您可以使用:

List<KeyValuePair<string, Filter>> fileFilterMap =
  Enumerable.Range(0, files.Count)
  .Select(i => new KeyValuePair<string, Filter>(files[i], filters[i]))
  .ToList();

或者:

List<KeyValuePair<string, Filter>> fileFilterMap =
  Enumerable.Zip(
    files,
    filters,
    (file, filter) => new KeyValuePair<string, Filter>(file, filter)
  )
  .ToList();

答案 1 :(得分:5)

查看Enumerable.Zip

var fileFilterMap = Enumerable.Zip(files, filters, (file, filter) => new KeyValuePair(file, filter));

答案 2 :(得分:2)

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

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

会工作。

那说,for(int i; i != files.Count; ++i)出了什么问题。我认为这是优越的(稍微快一点,更清晰)。

答案 3 :(得分:1)

认为您的Filter类包含属于它的属性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();
    }

答案 4 :(得分:1)

这是一个可能的解决方案,虽然它不是很漂亮..(因为它对文件中的每个项目进行了IndexOf查找。并且它要求文件中的每个条目都唯一。)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

var fileFilterMap = files.Zip(filters, (file, filter) => new KeyValuePair<string,Filter>(file, filter)).ToList();