C# ';转换为';字典<;字符串,int>;进入列表<;对象>;
我有一个C# ';转换为';字典<;字符串,int>;进入列表<;对象>;,c#,.net,linq,C#,.net,Linq,我有一个字典Dictionary 1,我需要将其转换为列表,其中数据具有属性标签=Dictionary 1.key和值=Dictionary 1.value。我不想使用for/foreach循环(由我自己编写),因为为了避免它,我尝试使用字典 另一种选择是使用两种不同的字典(字典2和字典3),其中dictionary2和dictionary3 我说得通吗?可能吗?有更好的选择吗?也许您可以使用LINQ dictionary1.Select(p => new Data(p.Key, p.Va
字典Dictionary 1
,我需要将其转换为列表
,其中数据
具有属性标签
=Dictionary 1.key和值
=Dictionary 1.value。我不想使用for/foreach循环(由我自己编写),因为为了避免它,我尝试使用字典
另一种选择是使用两种不同的字典(字典2和字典3),其中dictionary2
和dictionary3
我说得通吗?可能吗?有更好的选择吗?也许您可以使用LINQ
dictionary1.Select(p => new Data(p.Key, p.Value)).ToList()
然而,这是在使用yield
并因此在后台循环…公共类数据
myDictionary.Select(x => new Data(){ label = x.Key, value = x.Value).ToList();
{
公共字符串密钥{get;set;}
公共int值{get;set;}
}
私有静态void Main(字符串[]args)
{
字典字典1=新字典();
字典1.添加(“键1”,1);
字典1.添加(“键2”,2);
List data=dictionary1.Select(z=>newdata{Key=z.Key,Value=z.Value}).ToList();
Console.ReadLine();
}
假设:
class Data
{
public string Label { get; set; }
public int Value { get; set; }
}
然后:
dic;
List List=dic.Select(p=>newdata{Label=p.Key,Value=p.Value}).ToList();
试试看
我假设“无循环”实际上意味着“我想要LINQ”:
List=dictionary1.选择(
pair=>newdata(){
label=pair.Key,
value=pair.value
})).ToList();
.NET已经有了一种数据类型,它执行数据
将要执行的操作:键值对
。字典已经实现了IEnumerable
,只需强制转换即可
Dictionary<string, int> blah = new Dictionary<string, int>();
IEnumerable<KeyValuePair<string, int>> foo = blah;
Dictionary blah=newdictionary();
IEnumerable foo=blah;
这是一篇老文章,但它只是为了帮助其他人;)
转换任何对象类型的示例:
public List<T> Select<T>(string filterParam)
{
DataTable dataTable = new DataTable()
//{... implement filter to fill dataTable }
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dataTable.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dataTable.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
string json = new JavaScriptSerializer().Serialize(rows);
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T[]));
var tick = (T[])deserializer.ReadObject(stream);
return tick.ToList();
}
}
公共列表选择(字符串过滤器参数)
{
DataTable=新的DataTable()
//{…实现筛选器以填充数据表}
列表行=新列表();
字典行;
foreach(dataTable.Rows中的DataRow dr)
{
行=新字典();
foreach(dataTable.Columns中的DataColumn列)
{
行添加(列名称,dr[col]);
}
行。添加(行);
}
string json=new JavaScriptSerializer().Serialize(行);
使用(MemoryStream stream=new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
DataContractJsonSerializer反序列化器=新的DataContractJsonSerializer(typeof(T[]);
var tick=(T[])反序列化程序.ReadObject(流);
返回tick.ToList();
}
}
以防万一,我这样做只是为了帮助任何人,它将处理比单一值类型更复杂的对象,如OP所述
// Assumes: Dictionary<string, MyObject> MyDictionary;
List<MyObject> list = new List<MyObject>();
list.AddRange(MyDictionary.Values.ToArray());
//假设:Dictionary MyDictionary;
列表=新列表();
AddRange(MyDictionary.Values.ToArray());
“不想使用循环”会很困难。您将不得不以某种方式迭代字典。您将获得相当多的LINQ
答案-请注意LINQ
库仍然基本上运行foreach
以返回结果。所有(当前)答案都包含关键成分-选择转换。这将在字典上执行一次迭代,但是您没有“循环”。同意Tim Schmelter的观点,我怀疑你只是不想看到for/foreach的语法丑陋,“不想使用循环”:O?那是不可能的。AFAIK甚至所有LINQ扩展方法都在幕后使用“循环”(优化)。这就是编辑按钮的用途,没有什么可遗憾的。=)这将需要Data
拥有一个构造函数,该构造函数将值作为参数,这在问题中没有指定。@ErenErsönmez是的,但如果他需要的话,将其内联初始化是一件小事。我指出的是一种技术,而不是一种可复制粘贴的解决方案!这是初始化结构所必需的,因为它是不可变的。非常简单。如果不了解OP的需求,我们就无法知道它是否真的不需要比这更复杂。:)我同意如果键
绝对必须重命名标签
,它将无法满足需要。但这是避免循环AFAIK的唯一方法。然而,即使演员阵容也毫无意义。OP可以在任何需要IEnumerable的地方使用字典。不幸的是,我需要将数据重命名为Label。我试过这么做,但我会和你说的一样。因此,非常感谢您的帮助,我很抱歉,我没有明确表示我不想自己编写for/foreach循环,因为我知道内置函数会以更好的方式为我完成这项工作(即使需要在后台进行循环)。应该注意的是,如果您使用的是结构,它将是yourDictionary.Select(p=>newYourStruct(p.Key,p.Value)).ToList()代码>
List<Data> = dictionary1.Select(
pair => new Data() {
label = pair.Key,
value = pair.Value
})).ToList();
Dictionary<string, int> blah = new Dictionary<string, int>();
IEnumerable<KeyValuePair<string, int>> foo = blah;
public List<T> Select<T>(string filterParam)
{
DataTable dataTable = new DataTable()
//{... implement filter to fill dataTable }
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dataTable.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dataTable.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
string json = new JavaScriptSerializer().Serialize(rows);
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T[]));
var tick = (T[])deserializer.ReadObject(stream);
return tick.ToList();
}
}
// Assumes: Dictionary<string, MyObject> MyDictionary;
List<MyObject> list = new List<MyObject>();
list.AddRange(MyDictionary.Values.ToArray());