以更好的方式在C#中循环trought对象列表?
我有一个foreach循环,它循环一系列对象。它的意思是将NavigateUrl设置为超链接。我的代码如下所示:以更好的方式在C#中循环trought对象列表?,c#,loops,C#,Loops,我有一个foreach循环,它循环一系列对象。它的意思是将NavigateUrl设置为超链接。我的代码如下所示: foreach (var con in contacts) { if (con.ContactTypeID == 1) { FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL; }
foreach (var con in contacts)
{
if (con.ContactTypeID == 1)
{
FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
}
}
我想知道他们是否有更好的方法。我将有大约10个其他ContactTypeID,我不想再写9个了。您可以使用LINQ:
var facebookURL = contacts.Where(c => c.ContactTypeID == 1)
.Select(c => c.url)
.FirstOrDefault();
if(facebookURL != null)
FacebookIcon.NavigateUrl = "http://facebook.com/" + facebookURL;
编辑:实际上,您可以利用LINQ的延迟执行功能,对每种类型的联系人类型重复使用相同的功能:
var contactType = 1; // facebook
var url = contacts.Where(c => c.ContactTypeID == contactType)
.Select(c => c.url);
if (url.Any())
FacebookIcon.NavigateUrl = "http://facebook.com/" + url.First();
contactType = 2; // google
if (url.Any())
GoogleIcon.NavigateUrl = "http://Google.com/" + url.First();
编辑2:这里有另一种方法,使用字典将所有类型与其URL进行映射,如果您有数百万个类型,这种方法应该更有效;-)(@MAfifi):
您可以使用LINQ:
var facebookURL = contacts.Where(c => c.ContactTypeID == 1)
.Select(c => c.url)
.FirstOrDefault();
if(facebookURL != null)
FacebookIcon.NavigateUrl = "http://facebook.com/" + facebookURL;
编辑:实际上,您可以利用LINQ的延迟执行功能,对每种类型的联系人类型重复使用相同的功能:
var contactType = 1; // facebook
var url = contacts.Where(c => c.ContactTypeID == contactType)
.Select(c => c.url);
if (url.Any())
FacebookIcon.NavigateUrl = "http://facebook.com/" + url.First();
contactType = 2; // google
if (url.Any())
GoogleIcon.NavigateUrl = "http://Google.com/" + url.First();
编辑2:这里有另一种方法,使用字典将所有类型与其URL进行映射,如果您有数百万个类型,这种方法应该更有效;-)(@MAfifi):
你可以使用LINQ来做你想做的事情
var x = contacts.FirstOrDefault (c => c.ContactTypeID == 1);
if( x != null )
{
FacebookIcon.NavigateUrl = String.Format ("http://facebook.com/{0}", x.ContactURL);
}
你可以使用LINQ来做你想做的事情
var x = contacts.FirstOrDefault (c => c.ContactTypeID == 1);
if( x != null )
{
FacebookIcon.NavigateUrl = String.Format ("http://facebook.com/{0}", x.ContactURL);
}
你可以使用开关
switch (caseSwitch)
{
case 1:
FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
break;
case 2:
//
break;
default:
//
break;
}您可以使用开关
switch (caseSwitch)
{
case 1:
FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
break;
case 2:
//
break;
default:
//
break;
}您可以使用linq
var con = contacts.FirsOrDefault(c => c.ContactTypeID.Equals(1));
if (con == null)
{
return;
}
con.NavigateUrl = "http://facebook.com/" + con.ContactURL;
或者如果你有更多的身份证
List<int> ids = new List<int> {1,2,5,7};
contacts.Where(c => ids.Containt(c.ContactTypeID)).ToList().ForEach(item => item.NavigateUrl = "http://facebook.com/" + item.ContactURL);
List id=新列表{1,2,5,7};
contacts.Where(c=>ids.Containt(c.ContactTypeID)).ToList().ForEach(item=>item.NavigateUrl=”http://facebook.com/“+item.ContactURL);
您可以使用linq
var con = contacts.FirsOrDefault(c => c.ContactTypeID.Equals(1));
if (con == null)
{
return;
}
con.NavigateUrl = "http://facebook.com/" + con.ContactURL;
或者如果你有更多的身份证
List<int> ids = new List<int> {1,2,5,7};
contacts.Where(c => ids.Containt(c.ContactTypeID)).ToList().ForEach(item => item.NavigateUrl = "http://facebook.com/" + item.ContactURL);
List id=新列表{1,2,5,7};
contacts.Where(c=>ids.Containt(c.ContactTypeID)).ToList().ForEach(item=>item.NavigateUrl=”http://facebook.com/“+item.ContactURL);
如果使用Linq,则应使用First或FirstOrDefault
var url = contacts.FirstOrDefault(c => c.ContactTypeID == 1).NavigateUrl;
如果使用Linq,则应使用First或FirstOrDefault
var url = contacts.FirstOrDefault(c => c.ContactTypeID == 1).NavigateUrl;
使用开关:
foreach (var con in contacts)
{
switch (con.ContactTypeID)
{
case 1:
FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
break;
case 2:
. . .
break;
. . .
}
}
使用开关:
foreach (var con in contacts)
{
switch (con.ContactTypeID)
{
case 1:
FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
break;
case 2:
. . .
break;
. . .
}
}
可能是一个浓缩的LINQ:
contacts.ForEach(c => { if (c.ContactTypeID == 1) FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL; });
如果要为每个ContactTypeID==1执行“it”操作。可能需要一个压缩LINQ:
contacts.ForEach(c => { if (c.ContactTypeID == 1) FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL; });
如果您想为每个ContactTypeID==1“it”,我假设每个联系人不一定是Facebook,您需要根据联系人的内容动态设置不同的属性 你最好的选择是一本
字典
或类似的东西,在那里你只需要做一些事情
var setCorrectUrl = new Dictionary<int, Action<Contact>>
{
// Appropriate entries in here, e.g. (syntax not quite right)
{
1,
(contact) => FacebookIcon.NavigateUrl = contact.ContactURL;
}
}
foreach (var con in contacts)
{
setCorrectUrl[con.ContactTypeID](con);
}
var setCorrectUrl=新字典
{
//此处有适当的条目,例如(语法不太正确)
{
1.
(contact)=>FacebookIcon.NavigateUrl=contact.ContactURL;
}
}
foreach(触点中的var con)
{
setCorrectUrl[con.ContactTypeID](con);
}
我假设每个联系人不一定是Facebook,您需要根据联系人的身份动态设置不同的属性
你最好的选择是一本字典
或类似的东西,在那里你只需要做一些事情
var setCorrectUrl = new Dictionary<int, Action<Contact>>
{
// Appropriate entries in here, e.g. (syntax not quite right)
{
1,
(contact) => FacebookIcon.NavigateUrl = contact.ContactURL;
}
}
foreach (var con in contacts)
{
setCorrectUrl[con.ContactTypeID](con);
}
var setCorrectUrl=新字典
{
//此处有适当的条目,例如(语法不太正确)
{
1.
(contact)=>FacebookIcon.NavigateUrl=contact.ContactURL;
}
}
foreach(触点中的var con)
{
setCorrectUrl[con.ContactTypeID](con);
}
好吧,我会对代码进行一些重构。
想象一下,他还有10种其他类型需要实现:)
上面提供的解决方案是可行的,但在可扩展性方面不是很好
因此,以下是我的解决方案:
1) 实现具有公共联系人属性的基类
public abstract class BaseContact
{
public string Name { get; set; }
public abstract string Url { get; set; }
}
2) 实现具体类型
public class FbContact : BaseContact
{
private string _baseUrl = "http://facebook.com/{0}";
private string _url = string.Empty;
public override string Url
{
get { return _url; }
set { _url = string.Format(_baseUrl, value); }
}
}
public class LinkedInContact : BaseContact
{
private string _baseUrl = "http://linkedin.com/{0}";
private string _url = string.Empty;
public override string Url
{
get { return _url; }
set { _url = string.Format(_baseUrl, value); }
}
}
3) 这只是一个用于设置导航url的帮助器类
public static class NavigationCreator
{
public static void SetUrl(BaseContact contact, HyperLink link)
{
link.NavigateUrl = contact.Url;
}
}
4) 一些用于可视化结果的测试代码
List<BaseContact> items = new List<BaseContact>();
for (int i = 0; i < 5; i++)
{
BaseContact item;
if (i % 2 == 0) item = new FbContact(); else item = new LinkedInContact();
item.Url = "My name " + i;
items.Add(item);
}
foreach (var contact in items)
{
HyperLink link = new HyperLink();
NavigationCreator.SetUrl(contact, link);
Console.WriteLine(link.NavigateUrl);
}
Console.Read();
List items=newlist();
对于(int i=0;i<5;i++)
{
基本接触项目;
如果(i%2==0)项=新FbContact();否则项=新LinkedInContact();
item.Url=“我的名字”+i;
项目。添加(项目);
}
foreach(项目中的var联系人)
{
超级链接=新的超级链接();
NavigationCreator.SetUrl(联系人,链接);
Console.WriteLine(link.NavigateUrl);
}
Console.Read();
好吧,我会对代码进行一些重构。
想象一下,他还有10种其他类型需要实现:)
上面提供的解决方案是可行的,但在可扩展性方面不是很好
因此,以下是我的解决方案:
1) 实现具有公共联系人属性的基类
public abstract class BaseContact
{
public string Name { get; set; }
public abstract string Url { get; set; }
}
2) 实现具体类型
public class FbContact : BaseContact
{
private string _baseUrl = "http://facebook.com/{0}";
private string _url = string.Empty;
public override string Url
{
get { return _url; }
set { _url = string.Format(_baseUrl, value); }
}
}
public class LinkedInContact : BaseContact
{
private string _baseUrl = "http://linkedin.com/{0}";
private string _url = string.Empty;
public override string Url
{
get { return _url; }
set { _url = string.Format(_baseUrl, value); }
}
}
3) 这只是一个用于设置导航url的帮助器类
public static class NavigationCreator
{
public static void SetUrl(BaseContact contact, HyperLink link)
{
link.NavigateUrl = contact.Url;
}
}
4) 一些用于可视化结果的测试代码
List<BaseContact> items = new List<BaseContact>();
for (int i = 0; i < 5; i++)
{
BaseContact item;
if (i % 2 == 0) item = new FbContact(); else item = new LinkedInContact();
item.Url = "My name " + i;
items.Add(item);
}
foreach (var contact in items)
{
HyperLink link = new HyperLink();
NavigationCreator.SetUrl(contact, link);
Console.WriteLine(link.NavigateUrl);
}
Console.Read();
List items=newlist();
对于(int i=0;i<5;i++)
{
基本接触项目;
如果(i%2==0)项=新FbContact();否则项=新LinkedInContact();
item.Url=“我的名字”+i;
项目。添加(项目);
}
foreach(项目中的var联系人)
{
超级链接=新的超级链接();
NavigationCreator.SetUrl(联系人,链接);
Console.WriteLine(link.NavigateUrl);
}
Console.Read();
每个ContactTypeID都属于不同的超链接吗?我会在您的Contact类中创建一个方法,并使smth类似-con.getNavigateUrl()
您希望为每个ContactTypeID做些什么-如果您做了几个if/else语句,这将帮助我们了解您想要完成的任务的要点。另外,您是否希望只有一个contacttypeid=1的联系人,或者您可以有10个具有该ID的联系人?每个contacttypeid是否都属于不同的超链接?我将在contact类中创建方法,并使smth类似-con.getNavigateUrl()
对于每个ContactTypeID,您想做什么?如果您做了几个if/else语句,这将有助于我们了解您想要完成的任务的要点。此外,您是否希望只有一个contacttypeid=1的联系人,或者您可以有10个具有该ID的联系人?foreach会将navigateurl设置为las