74. ICollection AddRange extension method

מדי פעם אנחנו משתמשים בICollection ולא בטיפוס ספציפי (כמו List)

שמתי לב שאין אף ממשק עם פונקציה של AddRange. אפשר לפתור את הבעיה ככה:

ניצור פשוט Extension Method כזה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void AddRange<T>(this ICollection<T> collection,
IEnumerable<T> range)
{
if (collection == null)
{
throw new ArgumentNullException
("collection", "Received null");
}
foreach (T current in range)
{
collection.Add(current);
}
}

הבעיה היא שמבט חטוף בReflector מראה שבList<T> יש מימוש יותר מסובך מהמימוש הנאיבי, כנראה טיפה יותר טוב באיזושהי צורה. לכן נוסיף טיפול מיוחד במקרה זה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void AddRange<T>(this ICollection<T> collection,
IEnumerable<T> range)
{
if (collection == null)
{
throw new ArgumentNullException
("collection",
"Received null");
}
List<T> list = collection as List<T>;
if (list != null)
{
list.AddRange(range);
}
else
{
foreach (T current in range)
{
collection.Add(current);
}
}
}

כעת נוכל לכתוב קוד כזה בכיף:

1
2
3
4
5
6
7
8
9
10
ICollection<string> favoriteSongs =
new Collection<string>();
favoriteSongs.AddRange(new[]
{
"Shine on you crazy diamond",
"Wish you were here",
"Another brick in the wall",
"Hey you"
});

קצת מזכיר את הכתיבה של Collection Initializer (ראו גם טיפ מספר 18), אלא שאפשר להשתמש בזה גם לא בConstructor, ולמעשה אפשר לעשות שילובים יפים כאלה:

1
2
3
4
5
6
7
favoriteSongs.AddRange(new List<string>
{
"Shine on you crazy diamond",
"Wish you were here",
"Another brick in the wall",
"Hey you"
});

יתרה מזו, בהינתן שAddRange של List<T> יותר טוב מזה שאנחנו כתבנו, אז הכתיבה הבאה עדיפה על הכתיבה עם Collection Initializer:

1
2
3
4
5
6
7
8
9
10
ICollection<string> favoriteSongs =
new List<string>();
favoriteSongs.AddRange(new []
{
"Shine on you crazy diamond",
"Wish you were here",
"Another brick in the wall",
"Hey you"
});

עדיפה מזו:

1
2
3
4
5
6
7
8
ICollection<string> favoriteSongs =
new List<string>
{
"Shine on you crazy diamond",
"Wish you were here",
"Another brick in the wall",
"Hey you"
};

מהסיבה ששימוש בCollection Initializer שקול לשימוש בפונקציה שאנחנו כתבנו.

יום מורחב טוב

שתף