这里有两个列表:
List<string> files;
List<Filter> filters;
我希望结果像这样:
List<KeyValuePair<string, Filter>> fileFilterMap;
我尝试了几种方法(lambda表达式,linq)但都失败了。 我真的不想用
for(int i = 0; i< files.count; i++)
这个方法。您可以使用:
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();
var fileFilterMap = Enumerable.Zip(files, filters, (file, filter) => new KeyValuePair(file, filter));
var fileFilterMap = files.Select((s, i) => new KeyValuePair<string, int>(s, filters[i])).ToList();
将会工作。
话虽如此,for(int i; i != files.Count; ++i)
有什么问题呢?我认为这更优秀(稍微快一些,更加清晰明了)。
认为您的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();
}
这是一个可能的解决方案,虽然它不太美观...(因为它对文件中的每个项目进行了IndexOf查找。并且需要files中的每个条目都是唯一的。)
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();
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();
for
循环?很可能它比其他方式更易读 并且 更高效。 - LukeH