前几天,我在C#中编写一些代码,以获取对象列表,每个对象包含一个数组字段,然后将其转换为映射(即字典),其中对象成为值,而对象数组字段的每个元素变为键.那可能没有多大意义,所以让我们展示一些代码.在Scala中,我可能会执行以下操作:
// Data class
class MyClass(val keys:Array[String])
object MyClasstests {
// Dummy method just to get some sample data
def getMyClassList() = List(
new MyClass(Array("one", "two", "three")),
new MyClass(Array("four", "five", "six")))
def test() = {
val list = getMyClassList()
val map1 = list.view.flatMap(mc => mc.keys.map(_ -> mc)).toMap
// or, if you like for-comprehensions:
val map2 = (for (mc <- list.view; k <- mc.keys) yield k -> mc).toMap
map1 // or map2, same difference
}
}
在REPL中运行它,可以给我们(添加格式):
res0: scala.collection.immutable.Map[String,MyClass] =
Map(four -> MyClass@4ee31ef2,
three -> MyClass@69bc6271,
two -> MyClass@69bc6271,
six -> MyClass@4ee31ef2,
five -> MyClass@4ee31ef2,
one -> MyClass@69bc6271)
但是,我不想在Scala中执行此操作,而是想在C#中执行此操作.下面提供了两种可能的解决方案,Test1()是一种非常必要的解决方案,而Test2()则是我在现场想到的类似方案.
所以我的问题是:忽略该示例看似荒谬的事实,Test2()确实是最接近Scala代码的类似物,这是在C#中执行此操作的最简洁方法吗?有没有更简洁的方法来完成相同的任务(在C#中)?
// Data class
class MyClass {
public string[] Keys { get; set; }
}
class MyClasstests {
// Dummy method just to get some sample data
public static IList<MyClass> GetMyClassList() {
return new List<MyClass> {
new MyClass {
Keys = new[] {"one", "two", "three"}
},
new MyClass {
Keys = new[] {"four", "five", "six"}
}
};
}
public void Test1() {
var list = GetMyClassList();
var validTypes = new Dictionary<string, MyClass>();
foreach (var h in list) {
foreach (var key in h.Keys)
validTypes.Add(key, h);
}
}
public void Test2() {
var list = GetMyClassList();
var validPartTypes = list
.SelectMany(mc => mc.Keys.Select(k => new keyvaluePair<string,MyClass>(k, mc)))
.ToDictionary(x => x.Key, x => x.Value);
}
}
解决方法:
您可以使用匿名类型代替keyvaluePair<>.使它更加简洁:
var validPartTypes = list.SelectMany(mc => mc.Keys.Select(k => new { k, mc }))
.ToDictionary(x => x.k, x => x.mc);
或者,如果您觉得LINQ查询语法更清晰,则可能是:
var validPartTypes = (from mc in list
from k in mc.Keys
select new { k, mc })
.ToDictionary(x => x.k, x => x.mc);
但是,您的代码是完全有效的,而且我看不到任何更好的方法可以在C#中完成.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。