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