【问题标题】:linq how can I fill a dictionary objectlinq 如何填充字典对象
【发布时间】:2013-02-27 17:50:58
【问题描述】:

我以前有这个,我已经消除了 KVP,只拥有 Dictionary 属性。

之前:

public class GranuleAttributes
{
    public Dictionary<string, KVP> attributes { get; set; }
}
public class KVP
{
    public string ID { get; set; }
    public string Value { get; set; }
}

之后:

public class GranuleAttributes
{
    public Dictionary<string, string> attributes { get; set; }
}

在我用以下 LINQ 填充我的字典之前:

  attributes =
    (
        from attrRow in granuleGroup.First()
        select new KVP()
        {
            ID = Convert.ToString(attrRow["AttributeID"],
            Value = (string)attrRow["AttributeValue"]
        }
    ).ToDictionary(p => p.ID)

我现在如何填充我的属性对象?

更新

好的,完全公开,这里是代码:

var groups = reader.Cast<IDataRecord>()
    .GroupBy(dr => new { ID = (int)dr["id"] })
    .GroupBy(g => g.Key.ID);

response.attributes = (
    from granuleGroup in groups
    let granuleRow = granuleGroup.First().First()
    select new USpaceDataAttributes()
    {
        id = (int)granuleRow["id"],
        endDate = Convert.ToDateTime(granuleRow["endDate"]),
        startDate = Convert.ToDateTime(granuleRow["startDate"]),
        type = !DBNull.Value.Equals(granuleRow["type"]) ? (string)granuleRow["type"] : "",
        attributes =
        (
            from attrRow in granuleGroup.First()
            select new KVP()
            {
                ID = !DBNull.Value.Equals(attrRow["AttributeID"]) ? Convert.ToString(attrRow["AttributeID"]) : string.Empty,
                Value = !DBNull.Value.Equals(attrRow["AttributeValue"]) ? (string)attrRow["AttributeValue"] : string.Empty
            }
        ).ToSerializableDictionary(p => p.ID)
    }
).ToList();

然后我有自己的类,喜欢public class SerializableDictionary&lt;TKey, TVal&gt; : Dictionary&lt;TKey, TVal&gt;, IXmlSerializable, ISerializable,具有以下扩展方法。

#region ExtensionMethod
public static class CollectionExtensions
{

    public static SerializableDictionary<TKey, T> ToSerializableDictionary<TKey, T>(this IEnumerable<T> seq, Func<T, TKey> keySelector)
    {
        var dict = new SerializableDictionary<TKey, T>();
        foreach (T item in seq)
        {
            TKey key = keySelector(item);
            dict.Add(key, item);
        }

        return dict;
    }
} 
#endregion

【问题讨论】:

  • granuleGroup 有什么类型?
  • @lazyberezovsky 更新完整代码。

标签: c# linq


【解决方案1】:

我认为您不需要选择匿名对象或 KVP 对象

attributes = granuleGroup.First()
                 .ToDictionary(r => Convert.ToString(r["AttributeID"]),
                               r => Convert.ToString(r["AttributeValue"]));

更新:您应该在扩展方法中添加值选择器

public static class CollectionExtensions
{    
    public static SerializableDictionary<TKey, TValue> ToSerializableDictionary<T, TKey, TValue>(
       this IEnumerable<T> source, Func<T, TKey> keySelector, Func<T, TValue> valueSelector)
    {
        var dict = new SerializableDictionary<TKey, TValue>();
        foreach (T item in source)
        {
            TKey key = keySelector(item);
            TValue value = valueSelector(item);
            dict.Add(key, value);
        }

        return dict;
    }
} 

【讨论】:

  • 更新完整代码。注意 ToDictionary 实际上是 ToSerializableDictionary 为了简单起见,我把它省略了,但也许它是相关的
  • @capdragon 更新答案以匹配您更新的问题。只需在扩展方法中添加值选择器,您可以在我的初始答案中使用ToSerializableDictionary 而不是ToDictionary
【解决方案2】:
attributes =
    (
        from attrRow in granuleGroup.First()
        select new {            
            Key = Convert.ToString(attrRow["AttributeID"],
            Value = (string)attrRow["AttributeValue"]
        }
    ).ToDictionary(p => p.Key, p => p.Value)

【讨论】:

  • 不明白为什么它现在给了我Cannot implicitly convert type 'Dictionary&lt;string,AnonymousType#1&gt;' to 'Dictionary&lt;string,string&gt;'
  • 好的,更新完整代码。注意 ToDictionary 实际上是 ToSerializableDictionary 为了简单起见,我把它省略了,但也许它是相关的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多