2016-08-13 92 views
0

在下面的代碼,我需要明確提到CountryIdCountryName但我想,以避免和試圖建立一個generic method轉換一個通用的IEnumerable <T>到了IEnumerable <KeyValuePair>(C#)

public struct KeyValueStruct 
{ 
    public int Key { get; set; } 
    public string Value { get; set; } 
} 

private static IEnumerable<KeyValueStruct> ConvertPocoToKeyValueList(IEnumerable<CountryPoco> list) 
{ 
    var result = new List<KeyValueStruct>(); 

    if (list != null) 
    { 
     foreach (var item in list) 
     { 
      result.Add(new KeyValueStruct() 
      { 
       Key = item.CountryId, 
       Value = item.CountryName 
      }); 
     } 
    } 

    return result; 
} 

我從列表中知道第一個屬性總是整數(在本例中是CountryId),第二個屬性是String。

我想使用Generics來實現,但我不確定這是否是最好的方法,請參閱我的建議代碼(雖然它不工作)。

private static IEnumerable<KeyValueStruct> ConvertPocoToKeyValueList<T>(T list) 
{ 
    var result = new List<KeyValueStruct>(); 

    if (list != null) 
    { 
     foreach (var item in list) 
     { 
      result.Add(new KeyValueStruct() 
      { 
       Key = item.CountryId, 
       Value = item.CountryName 
      }); 
     } 
    } 

    return result; 
} 

如果您有更好的主意來達到同樣的效果,那麼請提出建議。

+1

什麼是KeyValueStruct?任何你不使用.NET框架中的KeyValuePair 的理由?請注意,LINQ使所有這些微不足道的,btw ...'var result = countries.Select(c => new KeyValuePair (c.CountryId,c.CountryName).ToList();'當然,你需要處理輸入爲空,也許......但是你可能會發現,防止這種情況發生會更好。 –

+0

@JonSkeet:我意識到我錯過了KeyValueStruct,並且剛剛添加到問題中。具有自定義結構在性能方面要快得多,所以我決定自己實現,而不是使用.NET的默認KeyValuePair。有沒有辦法避免對'c.CountryId,c.CountryName'進行硬編碼? –

+0

Um ,'KeyValuePair'已經是一個結構體......你認爲你自己的'KeyValueStruct'類型的速度更快嗎?無可否認這是一個可變值類型,這是一個不同的...但不是一個積極的類型 –

回答

2

您可以通過傳遞要用作鍵和值的屬性來使該泛型。我認爲使用名爲KeyValuePair<Tkey, TValue>通用struct比重新發明輪子自己更好:

private static IEnumerable<KeyValuePair<Tkey, TValue>> 
         ConvertPocoToKeyValueList<TSource, Tkey, TValue> 
            (IEnumerable<TSource> list, 
            Func<TSource, Tkey> keySelector, 
            Func<TSource, TValue> valueSelector) 
     { 
      return list.Select(item => new KeyValuePair<Tkey, TValue> 
              (keySelector(item), valueSelector(item))); 
     } 

用法:

var result = ConvertPocoToKeyValueList(list, x=> x.CountryId, x=> x.CountryName); 

你甚至可以做,沒有使用這種通用的方法,通過直接使用:

var result = list.Select(item => new KeyValuePair<Tkey, TValue> 
               (item.CountryId, item.CountryName)); 
+1

不需要'foreach',只需要使用Linq'Select',更加整潔。 – DavidG

+0

也不需要'TKey'和'TValue'類型,我們已經知道'KeyValueStruct'的結構 – DavidG

+0

@DavidG我真的覺得這個方法是沒用的,因爲用戶可以使用Select來創建他想要的而不需要創建一個通用的方法只調用另一個泛型方法。 – user3185569

相關問題